我正在使用 PHP 将表单值提交到数据库中,但当用户输入撇号等特殊字符时遇到问题。例如,如果有人将 Bill's Pet Supply
输入到组织中,就会出现 SQL 错误。
这是我的代码:
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if(isset($_POST['submit'])) {
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$organization = $_POST['organization'];
$sql = $conn->prepare("INSERT INTO submissions VALUES (:firstname, :lastname, :email, :organization)");
$sql->bindValue(':firstname', $firstname);
$sql->bindValue(':lastname', $lastname);
$sql->bindValue(':email', $email);
$sql->bindValue(':organization', $organization);
$sql->execute();
}
$conn->close();
如何更改此代码以便支持撇号和其他特殊字符?
最佳答案
将准备好的语句与绑定(bind)占位符结合使用。 PDO 和 mysqli 都提供对这些的支持。
您的 SQL 文本将如下所示:
$sql = "INSERT INTO submissions (firstname, lastname, email, organization)
VALUES (?, ?, ?, ?)";
如果您使用的是 mysqli
$sth = $mysqli->prepare($sql);
if(!$sth) {
// handle error
}
$sth->bind_param("ssss", $firstname, $lastname, $email, $organization);
if( $res = $sth->execute() ) {
// process resultset
}
PDO 中提供了类似的函数,但您可以使用“绑定(bind)值”而不是“绑定(bind)参数”。
<小时/>如果由于某种原因您无法将准备好的语句与绑定(bind)占位符一起使用,那么您至少需要正确转义 SQL 文本中包含的任何潜在不安全值。
如果您使用 mysqli,那么生成 SQL 文本将如下所示:
$sql = "INSERT INTO submissions (firstname, lastname, email, organization)
VALUES ('" . $mysqli->real_escape_string( $firstname )
. "', '" . $mysqli->real_escape_string( $lastname )
. "', '" . $mysqli->real_escape_string( $email )
. "', '" . $mysqli->real_escape_string( $organization )
. "')";
但不要这样做。使用带有绑定(bind)占位符的准备好的语句。
关于php - 从表单中将特殊字符插入 SQL 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38271070/