繁体   English   中英

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

[英]Inserting special characters into SQL database from form

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

如何更改此代码,以便支持撇号和其他特殊字符?

使用带有绑定占位符的 准备好的语句 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中提供了类似的功能,但是您可以使用“绑定值”代替“绑定参数”。


如果由于某种原因不能使用带有绑定占位符的预准备语句,则至少需要适当地转义 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 )
  . "')";

但是不要那样做。 使用带有绑定占位符准备好的语句

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM