【问题标题】:Error when search words contain special characters in phpphp中搜索词包含特殊字符时出错
【发布时间】: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


【解决方案1】:

你已经成功了一半。准备好的语句将允许您执行此查询,但您必须正确使用它们。要正确使用它们,您必须参数化查询。所有值都应该是查询中的占位符,然后它们应该被绑定。

试试:

$stmt = $DBcon->prepare("SELECT * FROM player WHERE player_name LIKE concat('%', ?, '%') LIMIT 25");
$stmt->execute(array($Search));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    相关资源
    最近更新 更多