【发布时间】:2018-06-10 22:55:29
【问题描述】:
在搜索包含特殊字符的术语时遇到致命的 PHP 错误(例如 John O'Malley)。 Mysql数据库字符集为utf8_unicode_ci
dbconn.php 文件
<?php
$DB_host = "removed";
$DB_user = "removed";
$DB_pass = "removed";
$DB_name = "removed";
try
{
$DBcon = new PDO("mysql:host={$DB_host};dbname={$DB_name};charset=utf8",$DB_user,$DB_pass);
$DBcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
echo "";
}
php页面
<?php
$stmt = $DBcon->prepare("SELECT * FROM player WHERE player_name LIKE '%$Search%' LIMIT 25");
$stmt->execute();
?>
我收到的错误消息
致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在 /../results.php:167 中的第 1 行的“Malley%”LIMIT 25'附近使用正确的语法堆栈跟踪:#0 /../results.php (167): PDOStatement->execute() #1 {main} 在第 167 行的 /../results.php 中抛出
【问题讨论】:
-
你使用pdo绑定参数
-
这就是你使用准备好的语句的原因。恶意用户可以使用特殊字符来操纵数据库中的数据(SQL 注入攻击)。阅读 PDO 准备好的声明。
-
使用参数化查询来避免错误并防范SQL injection。
标签: php mysql pdo prepared-statement special-characters