Tuyên bố chuẩn bị UPDATE của MySQL

Chắc chắn rồi. Tôi có khá nhiều ví dụ trên trang web này, chỉ cần xem phần "Liên quan" để biết những ví dụ đó. Nhưng hiện tại, đây là một phương thức mẫu ngắn thực hiện CẬP NHẬT SQL JDBC bằng cách sử dụng Java PreparedStatement

// a java preparedstatement example
public static void updateDescriptionAndAuthor [
  Connection conn,
  String description,
  int id,
  int seqNum,
  String author
]
throws SQLException
{
  try
  {
    // create our java preparedstatement using a sql update query
    PreparedStatement ps = conn.prepareStatement[
      "UPDATE Messages SET description = ?, author = ? WHERE id = ? AND seq_num = ?"];

    // set the preparedstatement parameters
    ps.setString[1,description];
    ps.setString[2,author];
    ps.setInt[3,id];
    ps.setInt[4,seqNum];

    // call executeUpdate to execute our sql update statement
    ps.executeUpdate[];
    ps.close[];
  }
  catch [SQLException se]
  {
    // log the exception
    throw se;
  }
}

Bây giờ tôi sẽ bỏ qua phần mô tả của ví dụ CẬP NHẬT

0 này, nhưng nếu bạn có bất kỳ câu hỏi hoặc nhận xét nào, hãy để lại bên dưới và tôi sẽ sẵn lòng trả lời chúng

Một câu lệnh đã chuẩn bị [còn được gọi là câu lệnh được tham số hóa] chỉ đơn giản là một mẫu truy vấn SQL chứa trình giữ chỗ thay vì các giá trị tham số thực tế. Các phần giữ chỗ này sẽ được thay thế bằng các giá trị thực tại thời điểm thực thi câu lệnh

MySQLi hỗ trợ việc sử dụng trình giữ chỗ vị trí ẩn danh [

1], như hình bên dưới

CHÈN VÀO người [first_name, last_name, email] GIÁ TRỊ [?, ?, ?];

Trong khi, PDO hỗ trợ cả trình giữ chỗ vị trí ẩn danh [

1], cũng như trình giữ chỗ được đặt tên. Trình giữ chỗ được đặt tên bắt đầu bằng dấu hai chấm [
3] theo sau là mã định danh, như thế này

CHÈN VÀO người [tên, họ, email]
GIÁ TRỊ [. họ,. họ,. thư điện tử];

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 hiện

  • Chuẩn bị — Ở giai đoạn chuẩn bị, một mẫu câu lệnh SQL được tạo và gửi đến máy chủ cơ sở dữ liệu. Máy chủ phân tích cú pháp mẫu câu lệnh, thực hiện kiểm tra cú pháp và tối ưu hóa truy vấn, đồng thời lưu trữ để sử dụng sau này
  • Thực thi — Trong khi thực thi, các giá trị tham số được gửi đến máy chủ. Máy chủ tạo một câu lệnh từ mẫu câu lệnh và các giá trị này để thực thi nó

Các câu lệnh đã chuẩn bị rất hữu ích, đặc biệt trong các tình huống khi bạn thực thi một câu lệnh cụ thể nhiều lần với các giá trị khác nhau, ví dụ: một loạt các câu lệnh

4. Phần sau đây mô tả một số lợi ích chính của việc sử dụng nó

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

Một câu lệnh đã chuẩn bị có thể thực hiện lặp đi lặp lại cùng một câu lệnh 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 nữa, 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, vì sau mỗi lần thực thi, chỉ cần truyền các giá trị giữ chỗ đến máy chủ cơ sở dữ liệu thay vì câu lệnh SQL hoàn chỉnh

Các câu lệnh đã chuẩn bị cũng cung cấp khả năng bảo vệ mạnh mẽ chống lại việc tiêm nhiễm SQL, 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 máy chủ cơ sở dữ liệu riêng biệt với truy vấn bằng một giao thức khác và do đó không thể can thiệp vào nó. Máy chủ sử dụng các giá trị này trực tiếp tại thời điểm thực thi, sau khi mẫu câu lệnh được phân tích cú pháp. Đó là lý do tại sao các câu lệnh đã 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

Ví dụ sau đây sẽ cho bạn thấy các câu lệnh đã chuẩn bị thực sự hoạt động như thế nào

Ví dụ

PDO hướng đối tượng thủ tục

Tải xuống

connect_error];
}
 
// Prepare an insert statement
$sql = "INSERT INTO persons [first_name, last_name, email] VALUES [?, ?, ?]";
 
if[$stmt = $mysqli->prepare[$sql]]{
    // Bind variables to the prepared statement as parameters
    $stmt->bind_param["sss", $first_name, $last_name, $email];
    
    /* Set the parameters values and execute
    the statement again to insert another row */
    $first_name = "Hermione";
    $last_name = "Granger";
    $email = "hermionegranger@mail.com";
    $stmt->execute[];
    
    /* Set the parameters values and execute
    the statement to insert a row */
    $first_name = "Ron";
    $last_name = "Weasley";
    $email = "ronweasley@mail.com";
    $stmt->execute[];
    
    echo "Records inserted successfully.";
} else{
    echo "ERROR: Could not prepare query: $sql. " . $mysqli->error;
}
 
// Close statement
$stmt->close[];
 
// Close connection
$mysqli->close[];
?>
setAttribute[PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION];
} catch[PDOException $e]{
    die["ERROR: Could not connect. " . $e->getMessage[]];
}
 
// Attempt insert query execution
try{
    // Prepare an insert statement
    $sql = "INSERT INTO persons [first_name, last_name, email] VALUES [:first_name, :last_name, :email]";
    $stmt = $pdo->prepare[$sql];
    
    // Bind parameters to statement
    $stmt->bindParam[':first_name', $first_name, PDO::PARAM_STR];
    $stmt->bindParam[':last_name', $last_name, PDO::PARAM_STR];
    $stmt->bindParam[':email', $email, PDO::PARAM_STR];
    
    /* Set the parameters values and execute
    the statement again to insert another row */
    $first_name = "Hermione";
    $last_name = "Granger";
    $email = "hermionegranger@mail.com";
    $stmt->execute[];
    
    /* Set the parameters values and execute
    the statement to insert a row */
    $first_name = "Ron";
    $last_name = "Weasley";
    $email = "ronweasley@mail.com";
    $stmt->execute[];
    
    echo "Records inserted successfully.";
} catch[PDOException $e]{
    die["ERROR: Could not prepare/execute query: $sql. " . $e->getMessage[]];
}
 
// Close statement
unset[$stmt];
 
// Close connection
unset[$pdo];
?>

Như bạn có thể thấy trong ví dụ trên, chúng tôi đã chuẩn bị câu lệnh

4 chỉ một lần nhưng thực thi nó nhiều lần bằng cách chuyển các tập tham số khác nhau

Giải thích Mã [Kiểu thủ tục]

Bên trong câu lệnh SQL

4 [dòng số 12] của ví dụ trên, các dấu chấm hỏi được sử dụng làm trình giữ chỗ cho các giá trị trường first_name, last_name, email

Hàm

connect_error];
}
 
// Prepare an insert statement
$sql = "INSERT INTO persons [first_name, last_name, email] VALUES [?, ?, ?]";
 
if[$stmt = $mysqli->prepare[$sql]]{
    // Bind variables to the prepared statement as parameters
    $stmt->bind_param["sss", $first_name, $last_name, $email];
    
    /* Set the parameters values and execute
    the statement again to insert another row */
    $first_name = "Hermione";
    $last_name = "Granger";
    $email = "hermionegranger@mail.com";
    $stmt->execute[];
    
    /* Set the parameters values and execute
    the statement to insert a row */
    $first_name = "Ron";
    $last_name = "Weasley";
    $email = "ronweasley@mail.com";
    $stmt->execute[];
    
    echo "Records inserted successfully.";
} else{
    echo "ERROR: Could not prepare query: $sql. " . $mysqli->error;
}
 
// Close statement
$stmt->close[];
 
// Close connection
$mysqli->close[];
?>
2 [dòng số 16] liên kết các biến với phần giữ chỗ [
1] trong mẫu câu lệnh SQL. Các phần giữ chỗ [
1] sẽ được thay thế bằng các giá trị thực được giữ trong các biến tại thời điểm thực hiện. Chuỗi định nghĩa kiểu được cung cấp làm đối số thứ hai i. e. chuỗi "sss" chỉ định rằng kiểu dữ liệu của mỗi biến liên kết là chuỗi

Chuỗi định nghĩa kiểu xác định kiểu dữ liệu của các biến liên kết tương ứng và chứa một hoặc nhiều trong bốn ký tự sau

  • b — nhị phân [chẳng hạn như hình ảnh, tệp PDF, v.v. ]
  • d — double [số dấu phẩy động]
  • i — số nguyên [số nguyên]
  • s - chuỗi [văn bản]

Số biến liên kết và số ký tự trong chuỗi định nghĩa kiểu phải khớp với số chỗ dành sẵn trong mẫu câu lệnh SQL

Sử dụng đầu vào nhận được thông qua biểu mẫu web

Nếu bạn còn nhớ từ chương trước, chúng tôi đã tạo một biểu mẫu HTML để. Ở đây, chúng ta sẽ mở rộng ví dụ đó bằng cách triển khai câu lệnh đã chuẩn bị. Bạn có thể sử dụng cùng một biểu mẫu HTML để kiểm tra ví dụ về tập lệnh chèn sau, nhưng chỉ cần đảm bảo rằng bạn đang sử dụng đúng tên tệp trong thuộc tính

connect_error];
}
 
// Prepare an insert statement
$sql = "INSERT INTO persons [first_name, last_name, email] VALUES [?, ?, ?]";
 
if[$stmt = $mysqli->prepare[$sql]]{
    // Bind variables to the prepared statement as parameters
    $stmt->bind_param["sss", $first_name, $last_name, $email];
    
    /* Set the parameters values and execute
    the statement again to insert another row */
    $first_name = "Hermione";
    $last_name = "Granger";
    $email = "hermionegranger@mail.com";
    $stmt->execute[];
    
    /* Set the parameters values and execute
    the statement to insert a row */
    $first_name = "Ron";
    $last_name = "Weasley";
    $email = "ronweasley@mail.com";
    $stmt->execute[];
    
    echo "Records inserted successfully.";
} else{
    echo "ERROR: Could not prepare query: $sql. " . $mysqli->error;
}
 
// Close statement
$stmt->close[];
 
// Close connection
$mysqli->close[];
?>
5 của biểu mẫu

Đây là mã PHP được cập nhật để chèn dữ liệu. Nếu bạn xem kỹ ví dụ, bạn sẽ thấy chúng tôi đã không sử dụng

connect_error];
}
 
// Prepare an insert statement
$sql = "INSERT INTO persons [first_name, last_name, email] VALUES [?, ?, ?]";
 
if[$stmt = $mysqli->prepare[$sql]]{
    // Bind variables to the prepared statement as parameters
    $stmt->bind_param["sss", $first_name, $last_name, $email];
    
    /* Set the parameters values and execute
    the statement again to insert another row */
    $first_name = "Hermione";
    $last_name = "Granger";
    $email = "hermionegranger@mail.com";
    $stmt->execute[];
    
    /* Set the parameters values and execute
    the statement to insert a row */
    $first_name = "Ron";
    $last_name = "Weasley";
    $email = "ronweasley@mail.com";
    $stmt->execute[];
    
    echo "Records inserted successfully.";
} else{
    echo "ERROR: Could not prepare query: $sql. " . $mysqli->error;
}
 
// Close statement
$stmt->close[];
 
// Close connection
$mysqli->close[];
?>
6 để thoát đầu vào của người dùng, giống như chúng tôi đã làm trong ví dụ chương trước. Vì trong các câu lệnh đã chuẩn bị, đầu vào của người dùng không bao giờ được thay thế trực tiếp vào chuỗi truy vấn, do đó, chúng không cần phải được thoát một cách chính xác

Ví dụ

PDO hướng đối tượng thủ tục

Tải xuống

connect_error];
}
 
// Prepare an insert statement
$sql = "INSERT INTO persons [first_name, last_name, email] VALUES [?, ?, ?]";
 
if[$stmt = $mysqli->prepare[$sql]]{
    // Bind variables to the prepared statement as parameters
    $stmt->bind_param["sss", $first_name, $last_name, $email];
    
    // Set parameters
    $first_name = $_REQUEST['first_name'];
    $last_name = $_REQUEST['last_name'];
    $email = $_REQUEST['email'];
    
    // Attempt to execute the prepared statement
    if[$stmt->execute[]]{
        echo "Records inserted successfully.";
    } else{
        echo "ERROR: Could not execute query: $sql. " . $mysqli->error;
    }
} else{
    echo "ERROR: Could not prepare query: $sql. " . $mysqli->error;
}
 
// Close statement
$stmt->close[];
 
// Close connection
$mysqli->close[];
?>
setAttribute[PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION];
} catch[PDOException $e]{
    die["ERROR: Could not connect. " . $e->getMessage[]];
}
 
// Attempt insert query execution
try{
    // Prepare an insert statement
    $sql = "INSERT INTO persons [first_name, last_name, email] VALUES [:first_name, :last_name, :email]";
    $stmt = $pdo->prepare[$sql];
    
    // Bind parameters to statement
    $stmt->bindParam[':first_name', $_REQUEST['first_name'], PDO::PARAM_STR];
    $stmt->bindParam[':last_name', $_REQUEST['last_name'], PDO::PARAM_STR];
    $stmt->bindParam[':email', $_REQUEST['email'], PDO::PARAM_STR];
    
    // Execute the prepared statement
    $stmt->execute[];
    echo "Records inserted successfully.";
} catch[PDOException $e]{
    die["ERROR: Could not prepare/execute query: $sql. " . $e->getMessage[]];
}
 
// Close statement
unset[$stmt];
 
// Close connection
unset[$pdo];
?>

Ghi chú. Mặc dù không bắt buộc phải thoát đầu vào của người dùng trong các câu lệnh đã chuẩn bị, nhưng bạn phải luôn xác thực loại và kích thước của dữ liệu nhận được từ các nguồn bên ngoài và thực thi các giới hạn thích hợp để bảo vệ chống lại việc khai thác tài nguyên hệ thống

Làm cách nào để cập nhật MySQL bằng câu lệnh đã chuẩn bị?

Quy trình .
Gọi kết nối. Chuẩn bị phương pháp để tạo một đối tượng PreparedStatement
setXXX phương pháp để truyền giá trị cho các biến đầu vào. .
execUpdate để cập nhật bảng với các giá trị biến
phương thức đóng để đóng đối tượng PreparedStatement khi bạn sử dụng xong đối tượng đó

Làm cách nào để sử dụng câu lệnh đã chuẩn bị cho truy vấn cập nhật trong PHP?

Cách tạo câu lệnh chuẩn bị cho truy vấn CẬP NHẬT .
Xác định một mảng với các giá trị được phép
Lặp lại mảng nguồn và tự động tạo câu lệnh SET cho SQL, dựa trên danh sách các trường được phép
Các giá trị tương ứng phải được thêm vào mảng được chỉ định sẽ được sử dụng trong hàm thực thi []

Làm cách nào để thêm câu lệnh đã chuẩn bị trong MySQL?

Cách sử dụng câu lệnh chuẩn bị sẵn của MySQL . CHUẨN BỊ – chuẩn bị một câu lệnh để thực thi. EXECUTE – thực thi một câu lệnh đã chuẩn bị được chuẩn bị bởi câu lệnh PREPARE. DEALLOCATE PREPARE – phát hành một tuyên bố đã chuẩn bị.

MySQL có hỗ trợ các câu lệnh đã chuẩn bị không?

Cơ sở dữ liệu MySQL hỗ trợ các câu lệnh đã chuẩn bị sẵn . Một câu lệnh đã chuẩn bị sẵn hoặc một câu lệnh được tham số hóa được sử dụng để thực thi lặp đi lặp lại cùng một câu lệnh với hiệu quả cao và bảo vệ chống lại việc tiêm SQL. 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 hiện.

Chủ Đề