Cập nhật câu lệnh đã chuẩn bị php

Bạn có thể sử dụng các câu lệnh đã chuẩn bị để chèn một bản ghi mới. Kết nối với máy chủ và cơ sở dữ liệu với mysqli

$db_found = new mysqli[DB_SERVER, DB_USER, DB_PASS, $database ];

và sau đó có dòng này

$SQL = $db_found->prepare["CHÈN VÀO thành viên [tên người dùng, mật khẩu, email] GIÁ TRỊ [?, ?, ?]"];

Ở đây, chúng tôi đang sử dụng lại chức năng chuẩn bị. Ở giữa các dấu ngoặc tròn chuẩn bị, có cái này

"CHÈN VÀO thành viên [tên người dùng, mật khẩu, email] GIÁ TRỊ [?, ?, ?]"

Bạn sử dụng INSERT INTO khi muốn thêm bản ghi mới vào bảng cơ sở dữ liệu của mình. Sau tên bảng của bạn, bạn nhập tên của các trường bảng. Trong đoạn mã trên, chúng ta có ba trường. tên người dùng, mật khẩu và email. Các trường nằm giữa dấu ngoặc tròn. Sau khoảng trắng, nhập GIÁ TRỊ. Đối với dấu ngoặc tròn của GIÁ TRỊ, chúng tôi có ba dấu chấm hỏi giữ chỗ [?], một dấu hỏi cho mỗi giá trị sẽ đi vào các trường

Bạn cần liên kết các giá trị với các tham số này, tiếp theo

$SQL->bind_param['sss', $userName, $passWORD, $email];

Lưu ý rằng có ba chữ cái s, vì mỗi trường trong bảng chứa các giá trị chuỗi. Sau đó chúng ta có ba biến. $uName, $passW, $email. Đây có thể đến từ một hình thức HTML

Cuối cùng, chúng ta cần thực thi câu lệnh đã chuẩn bị

$SQL->thực thi[];

Để xem tất cả những điều này đang hoạt động, có một số mã trong thư mục tập lệnh của bạn. Hãy xem tệp có tên testPrep2. php. Sau đó kiểm tra nó trên máy chủ của bạn. Nhập một số giá trị vào hộp văn bản và bạn sẽ thấy thông báo "Đã chèn hàng mới" được in ra

Cập nhật hồ sơ với báo cáo đã chuẩn bị

Bạn cập nhật một bản ghi trong PHP và MySql gần giống như cách bạn chèn một bản ghi mới. Đây là một số mã cập nhật tên người dùng và mật khẩu, dựa trên địa chỉ email được nhập vào hộp văn bản

$db_found = new mysqli[DB_SERVER, DB_USER, DB_PASS, $database ];

$SQL = $db_found->prepare["CẬP NHẬT thành viên SET username=?, password=? WHERE email=?"];

$SQL->bind_param['sss', $uName, $passW, $email];
$SQL->execute[];

Chúng tôi vẫn sử dụng chức năng chuẩn bị. Lần này giữa các dấu ngoặc tròn, chúng ta có cái này

["CẬP NHẬT thành viên SET username=?, password=? WHERE email=?"]

Các từ khóa SQL là UPDATE và SET. Chúng tôi đang cập nhật bảng cơ sở dữ liệu thành viên. Chúng tôi đang đặt tên người dùng và mật khẩu, mỗi tên này có trình giữ chỗ dấu chấm hỏi riêng. Mệnh đề WHERE ở cuối được sử dụng cho địa chỉ email. Vì vậy, "CẬP NHẬT tên người dùng và mật khẩu NƠI địa chỉ email khớp với địa chỉ được cung cấp

Lưu ý rằng hàm bind_param cần ba chữ cái s, một chữ cái cho mỗi trường chuỗi trong bảng

$SQL->bind_param['sss', $userName, $passWORD, $email];

Một lần nữa, $uName, $passWORD và $email đều là các biến chúng ta lấy từ một biểu mẫu HTML. Các giá trị này sẽ thay thế các trình giữ chỗ dấu chấm hỏi trong chức năng chuẩn bị

Cuối cùng, thực hiện mọi thứ

$SQL->thực thi[];

Mã đầy đủ để cập nhật bản ghi MySQL có thể được tìm thấy trong testPrep3. php, đây là một trong những tệp bạn đã tải xuống [trong thư mục tập lệnh]

Xóa bản ghi với báo cáo đã chuẩn bị

Nếu bạn muốn xóa bản ghi, áp dụng nguyên tắc tương tự. thiết lập kết nối đến máy chủ và cơ sở dữ liệu, sau đó chuẩn bị câu lệnh SQL

$db_found = new mysqli[DB_SERVER, DB_USER, DB_PASS, $database ];

$SQL = $db_found->prepare["XÓA KHỎI thành viên Ở ĐÂU email=?"];

Làm bind_param của bạn tiếp theo

$SQL->bind_param['s', $email];

Điều này liên kết một chuỗi với dấu hỏi email từ mệnh đề WHERE. Chuỗi thực tế đến từ biến $email

Sau đó thực hiện câu lệnh

$SQL->thực thi[];

Mã đầy đủ để xóa bản ghi MySQL có thể được tìm thấy trong testPrep4. php, đây là một trong những tệp bạn đã tải xuống [trong thư mục tập lệnh]

Câu lệnh soạn sẵn hay còn gọi là câu lệnh được tham số hóa thực chất đơn giản là một câu lệnh truy vấn SQL có chứa trình giữ chỗ thay vì các giá trị tham số thực tế. This place pages will be instead by the values ​​at the time point thực thi câu lệnh

Ở một số mã trang web bằng PHP thuần thường mắc phải lỗi SQL injection là do lập trình viên không biết đến lỗi này hoặc biết nhưng không tìm ra cách giải quyết nó. Trước đây chúng ta hay sử dụng hàm addslashes[] trong PHP để giải quyết nhưng bây giờ các thư viện xử lý cơ sở dữ liệu cũng đã đưa ra cơ chế chuẩn bị .

2. SQL setting SQL setting and the current process

Mình sẽ đưa ra chế độ hoạt động như sau. khi chúng ta viết câu truy vấn mà có dữ liệu động thì thay vì truyền trực tiếp tham số thì chúng ta sẽ thay các tham số đó bằng các biến ẩn danh, rồi sau đó chúng ta sẽ truyền giá trị cho các biến ẩn danh . prepared sao cho bảo mật nhất rồi mới chạy câu truy vấn.

Trước đây nếu truyền tham số vào câu truy vấn thì chúng ta hay thực hiện như ví dụ dưới đây

$username = $_POST['username'];
$password = $_POST['password']; 
$sql = "select * from users where username = '$username' and password = '$password'";

Đây là cách gán chuỗi thông thường và sẽ thắc mắc lỗi SQL injection. Ta có một cách khác sẽ giải quyết được phần nào đó là sử dụng hàm addslashes[].

$username = addslashes[$_POST['username']];
$password = addslashes[$_POST['password']];
$sql = "select * from users where username = '$username' and password = '$password'";

Bây giờ người ta đã không sử dụng cách trên nữa mà chức năng sử dụng có sẵn trong các thư viện MySQLi và PDO. Mỗi thư viện có cách thức hiện diện khác nhau nhưng chúng đều có chung một quy tắc đó là

  • Chúng ta đưa vào một câu hỏi với các tham số là một ẩn danh
  • Chúng ta truyền vào giá trị tương ứng cho các ẩn danh đó
  • PHP sẽ dựa trên các thư tự tham số ẩn danh và các giá trị để sửa chữa sao bảo mật nhất
  • Cuối cùng sẽ thực hiện câu hỏi này
  • Khi bạn đã khai báo các tham số lần đầu rồi và sau đó muốn sử dụng tiếp thì không cần phải khai báo nữa. Đây cũng chính là lợi thế của cơ chế được chuẩn bị trong PHP

Việc thực hiện Câu lệnh đã chuẩn bị bao gồm hai giai đoạn. Chuẩn bị và Thực thi

  • Chuẩn bị. Ở giai đoạn chuẩn bị, một câu lệnh SQL mẫu được tạo và gửi đến cơ sở dữ liệu máy chủ. Máy chủ phân tích câu lệnh mẫu, thực hiện kiểm tra cú pháp và tối ưu hóa truy vấn và lưu trữ nó để sử dụng sau. Một số giá trị nhất định không được chỉ định mà thay thế bằng các ký tự ? . Ví dụ. CHÈN VÀO GIÁ TRỊ Myguest [?,?,?]
  • thực thi. Trong quá trình thực thi, các tham số giá trị được gửi đến máy chủ. Máy chủ tạo một câu lệnh từ câu lệnh mẫu và sử dụng các giá trị này để thực hiện nó. Ứng dụng liên kết các giá trị với các tham số và cơ sở dữ liệu thực thi lệnh. Ứng dụng có thể thực thi lệnh bao nhiêu lần tùy ý với các giá trị khác nhau

Cơ sở dữ liệu sẽ phân tích cú pháp, biên dịch và thực hiện tối ưu hóa truy vấn trên mẫu câu lệnh SQL và lưu trữ kết quả biên dịch mà không thực thi nó

3. Sử dụng câu lệnh đã chuẩn bị bằng MySQLi

3. 1. Use MySQLi direction manual

Mysqli direction player không hỗ trợ chúng ta chuẩn bị nhưng chúng ta hoàn toàn có thể dựa vào mysqli_stmt trung gian để prepare.

Ví dụ

// khởi tạo kết nối
$connect = mysqli_connect['localhost', 'root', '', 'db_lttd'];
//Kiểm tra kết nối
if [!$connect] {
    die['kết nối không thành công ' . mysqli_connect_error[]];
}
//câu truy vấn
$sql = "SELECT content FROM tbl_news WHERE id=? ";
//gán id
$id = 8;
//gán Mysqli sang mysqli_stmt
$stmt = mysqli_stmt_init[$connect];
if [mysqli_stmt_prepare[$stmt, $sql]] {
    //tiến hành truyền dữ liệu vào biến ẩn danh
    mysqli_stmt_bind_param[$stmt, "i", $id];
    //chạy câu truy vấn
    mysqli_stmt_execute[$stmt];
    // gán dữ liệu trả về vào biến $data
    mysqli_stmt_bind_result[$stmt, $data];
    //thực hiện fetch dữ liệu
    mysqli_stmt_fetch[$stmt];
    //in ra kết quả trả về
    printf['Result: %s', $data];
    //close mysqli_stmt
    mysqli_stmt_close[$stmt];
}
//close mysqli
mysqli_close[$connect];

3. 2. Sử dụng MySQLi direction object

Ví dụ sau sẽ sử dụng các câu lệnh được chuẩn bị sẵn và liên kết các tham số trong MySQLi

Như bạn đã thấy thì trong ví dụ trên có câu truy vấn SQL là

“CHÈN VÀO MyGuest [tên, họ, email] GIÁ TRỊ [?, ?, ?]”

Trong truy vấn SQL này, mình đã chèn một dấu ?

Sau đó là lệnh gọi hàm bind_param[] .

$stmt->bind_param["sss", $firstname, $lastname, $email];

Hàm này liên kết các tham số với truy vấn SQL và cho cơ sở dữ liệu biết các tham số là gì. Argument ‘sss’ liệt kê các kiểu dữ liệu của tham số. Ký tự sẽ nói với mysql rằng tham số là một chuỗi. Trong truy vấn thì ta có 3 đối số kiểu string là $firstname, $lastname, $email nên ta có 3 ký tự s [‘sss’]

Argument may be a in the following type

  • i – integer
  • d – double
  • s – chuỗi
  • b – BLOB

Chúng ta sẽ phải có một số trong số này cho mỗi tham số. Bằng cách nói cho bất kỳ kiểu dữ liệu mysql nào được yêu cầu, chúng tôi đã giảm thiểu rủi ro của SQL Injection

Lưu ý

Nếu chúng ta muốn thêm bất kỳ dữ liệu nào từ các nguồn bên ngoài [chẳng hạn như thông tin người dùng nhập vào], thì điều rất quan trọng là dữ liệu đó phải được làm sạch và xác thực.

4. Sử dụng Tuyên bố đã chuẩn bị bằng PDO

Với PDO thì cú pháp có hơi khác chút xíu đó là ẩn số tham số không phải là dấu hỏi nữa mà ở dạng . tên biến .

Ví dụ

try {
    // Kết nối
    $conn = new PDO["mysql:host=localhost;dbname=db_lttd", 'root', 'vertrigo'];
    // Khai baso exception
    $conn->setAttribute[PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION];
    // prepare sql and bind parameters
    $stmt = $conn->prepare["INSERT INTO News [title, content] VALUES [:title, :content]"];
    $stmt->bindParam[':title', $title];
    $stmt->bindParam[':content', $content];
 
    // Thêm lần 1
    $title = 'Tiêu đề 1';
    $content = 'Nội dung 1';
    $stmt->execute[];
    // Thêm lần 2
    $title = 'Tiêu đề 2';
    $content = 'Nội dung 2';
    $stmt->execute[];
    echo "Thao tác thành công!";
} 
catch [PDOException $e] {
    echo "Error: " . $e->getMessage[];
}
// Ngắt kết nối
$conn = null;

Việc giải thích ví dụ này cũng tương tự như phần trên nhé

5. Ưu điểm của công việc sử dụng Báo cáo đã chuẩn bị

Câu lệnh đã chuẩn bị có thể thực hiện cùng một câu lệnh lặp đi lặp lại với hiệu quả cao, bởi vì câu lệnh chỉ được phân tích cú pháp một lần, trong khi nó có thể được thực hiện nhiều lần. Nó cũng giảm thiểu việc sử dụng băng thông, bởi vì mỗi lần thực hiện, chỉ có các giá trị giữ chỗ cần được chuyển đến máy chủ cơ sở dữ liệu thay vì truyền cả câu lệnh SQL hoàn chỉnh

Prepared Statement cũng cung cấp sự bảo vệ mạnh mẽ chống lại SQL injection [Hành động cố gắng truyền câu lệnh SQL để thao tác bỏ qua], bởi vì các giá trị tham số không được nhúng trực tiếp bên trong chuỗi truy vấn SQL. Các giá trị tham số được gửi đến cơ sở dữ liệu máy chủ được phân tách với truy vấn bằng một giao thức khác và do đó không thể xâm nhập vào nó

Máy chủ sử dụng các giá trị này trực tiếp tại điểm thực hiện, sau khi mẫu câu lệnh được phân tích cú pháp. Đó là lý do tại sao các Tuyên bố đã chuẩn bị ít bị lỗi hơn và do đó được coi là một trong những yếu tố quan trọng nhất trong bảo mật cơ sở dữ liệu

Chủ Đề