如何在 MySQL 的表单字段中接受撇号
How to accept apostrophe in a form field for MySQL
我有一个表格,它接受一些名字和 phone 数字并将它们发布到 PHP 脚本,然后将这些值插入 MySQL table。代码 (PHP) 非常简单,您可以在此处看到:
$sql = "INSERT INTO Contact_table (PHONE, NAME) VALUES ";
for ($i = 0; $i < $arr; ++$i){
$sql .= "('".$numbers[$i]."', '".$names[$i]."'),";
}
$sql = substr($sql, 0, -1)." ON DUPLICATE KEY UPDATE name = COALESCE(VALUES(name), name);";
$connect = dbconn(PROJHOST,PROJDB,PROJDBUSER,PROJDBPWD);
$query = $connect->query($sql);
$connect = NULL;
除了拒绝接受 O'Hara 或 D'Souza 之类的任何名称外,这一切都很完美。我隐约知道 PDO 的准备语句在这种情况下有一些用处,但我无法让它发挥作用。我试过的是:
$query = $connect->prepare($sql);
$query->execute();
而不是这个:
$query = $connect->query($sql);
有什么提示吗?我错过了什么?
有几种方法可以解决您的问题。你可以使用 real_escape_string
转义你的字符串,但是你建议更好的方法。最好的方法是使用 mysqli 或 PDO 通过准备好的语句。
既然你提到了 PDO,这是一个很好的方法,下面是如何处理它:
第一件事涉及 运行 通过 try
和 catch
连接,然后 运行 使用占位符查询,然后将变量绑定到这些占位符.这是其工作原理的简单方法:
try {
$connect = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$stmt = $conn->prepare("INSERT INTO Contact_table (PHONE, NAME) VALUES (:PHONE, :NAME)");
$stmt->bindParam(':PHONE', $PHONE);
$stmt->bindParam(':NAME', $NAME);
//then name your variables like so
$PHONE = [whatever your phone number variable(s) is/are equal to];
$NAME = [whatever the NAME variable(s) is/are equal to];
$stmt->execute();
//note the last section can occur within a loop, much like you have above.
catch(PDOException $error)
}
{
echo "Error: " . $error->getMessage();
}
$connect = null;
}
请注意,这不仅会允许任何带有特殊字符(例如撇号)的字段,而且对于大型查询来说 运行 会快得多,而且还有一个额外的好处,那就是更加安全,因为它几乎消除了大多数 SQL 注入方法。
您也可以使用 mysqli
准备好的语句来完成此操作,但是 PDO
具有与数据库无关的额外优势,因为可以轻松连接到 MySQL 以外的数据库。
此外,您可以使用 ?
方法来定义松散定义的参数,如评论之一所述,但这也有助于将它们作为对象进行操作。
如果您想了解更多,这里有一个很好的参考:PHP Prepared Statements
我有一个表格,它接受一些名字和 phone 数字并将它们发布到 PHP 脚本,然后将这些值插入 MySQL table。代码 (PHP) 非常简单,您可以在此处看到:
$sql = "INSERT INTO Contact_table (PHONE, NAME) VALUES ";
for ($i = 0; $i < $arr; ++$i){
$sql .= "('".$numbers[$i]."', '".$names[$i]."'),";
}
$sql = substr($sql, 0, -1)." ON DUPLICATE KEY UPDATE name = COALESCE(VALUES(name), name);";
$connect = dbconn(PROJHOST,PROJDB,PROJDBUSER,PROJDBPWD);
$query = $connect->query($sql);
$connect = NULL;
除了拒绝接受 O'Hara 或 D'Souza 之类的任何名称外,这一切都很完美。我隐约知道 PDO 的准备语句在这种情况下有一些用处,但我无法让它发挥作用。我试过的是:
$query = $connect->prepare($sql);
$query->execute();
而不是这个:
$query = $connect->query($sql);
有什么提示吗?我错过了什么?
有几种方法可以解决您的问题。你可以使用 real_escape_string
转义你的字符串,但是你建议更好的方法。最好的方法是使用 mysqli 或 PDO 通过准备好的语句。
既然你提到了 PDO,这是一个很好的方法,下面是如何处理它:
第一件事涉及 运行 通过 try
和 catch
连接,然后 运行 使用占位符查询,然后将变量绑定到这些占位符.这是其工作原理的简单方法:
try {
$connect = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$stmt = $conn->prepare("INSERT INTO Contact_table (PHONE, NAME) VALUES (:PHONE, :NAME)");
$stmt->bindParam(':PHONE', $PHONE);
$stmt->bindParam(':NAME', $NAME);
//then name your variables like so
$PHONE = [whatever your phone number variable(s) is/are equal to];
$NAME = [whatever the NAME variable(s) is/are equal to];
$stmt->execute();
//note the last section can occur within a loop, much like you have above.
catch(PDOException $error)
}
{
echo "Error: " . $error->getMessage();
}
$connect = null;
}
请注意,这不仅会允许任何带有特殊字符(例如撇号)的字段,而且对于大型查询来说 运行 会快得多,而且还有一个额外的好处,那就是更加安全,因为它几乎消除了大多数 SQL 注入方法。
您也可以使用 mysqli
准备好的语句来完成此操作,但是 PDO
具有与数据库无关的额外优势,因为可以轻松连接到 MySQL 以外的数据库。
此外,您可以使用 ?
方法来定义松散定义的参数,如评论之一所述,但这也有助于将它们作为对象进行操作。
如果您想了解更多,这里有一个很好的参考:PHP Prepared Statements