php - 从表单中将特殊字符插入 SQL 数据库

标签 php mysql forms

我正在使用 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

mysqli_prepare

myslqi_bind_param

myslqi_execute

$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/

相关文章:

php - 对 uuid 有要求的 Symfony Controller 路由

forms - 禁用按钮仍会触发 Click 事件

mysql - SQL - 插入后创建触发器

C# 数据表问题

mysql - 你调用的对象是空的

ajax - 通过ajax渲染其他表单会导致其 View 状态丢失,如何将其添加回来?

javascript - jQuery 选项卡/验证提交多个表单

php - paypal支付后添加积分系统

PHP、SQL - 复杂的查询需要 40 多秒

javascript - Jquery laravel 中带有特殊字符的 URL 参数