PDO SQL 使用 " 和 ' 输入文本字段

Posted

技术标签:

【中文标题】PDO SQL 使用 " 和 \' 输入文本字段【英文标题】:PDO SQL enter text field with " and 'PDO SQL 使用 " 和 ' 输入文本字段 【发布时间】:2018-10-04 07:56:19 【问题描述】:

尝试同时使用 " 和 ' 进行插入查询

我有$description = addslashes($description);

但我仍然得到:

SQLSTATE[42000]:语法错误或访问冲突:1064 你有一个 SQL 语法错误;检查与您对应的手册 mysql 服务器版本,用于在 '27"","Product 附近使用正确的语法

$descriptionaddslashes() 之后是"Capacity:26\",27\" and 700C Wheel Sizes"

查询:

$handler->query('INSERT INTO `tm_products`
            (`title`, `description`, `member_name`, `category_path`) 
    VALUES ("'.$apiGetListing['Title'].'",
            "'.$description.'","'.$member_name.'",
            "'.$apiGetListing['CategoryPath'].'")');

我认为它试图在26\" "?

处结束查询

【问题讨论】:

请查看准备好的语句 - 有很多关于如何使用它们的教程/问题,***.com/questions/1290975/… 等。 您究竟为什么使用addslashes 来引用您的数据?这不是推荐的方式 - 文档清楚地告诉您不要使用它来引用数据库输入 现在你的代码很容易受到 SQL 注入的攻击。请使用准备好的查询;更多信息:php.net/manual/en/pdo.prepared-statements.php 【参考方案1】:

你真的需要清理你的论点。您对 SQL 注入持开放态度。

    <?php
    $servername = "localhost";
    $username = "";
    $password = "";
    $dbname = "";

    $conn = new mysqli($servername, $username, $password, $dbname);

    $stmt = $conn->prepare("INSERT INTO tm_products(title, description, member_name, category_path) VALUES(?, ?, ?, ?))");
    $stmt->bind_param("ssss", $title, $description, $member_name, $category_path);

    $title= $apiGetListing['Title'];
    $description= $description;
    $member_name= $member_name;
    $category_path = $apiGetListing['CategoryPath'];

    $stmt->execute();

    $stmt->close();
    $conn->close();

【讨论】:

【参考方案2】:

一些建议:

1-使用heredoc语法提高可读性:

例子:

$query = <<<SQL
    INSERT INTO `tm_products`
    (`title`, `description`, `member_name`, `category_path`) VALUES 
    (
        "$apiGetListing['Title']", 
        "$description", 
        "$member_name", 
        "$apiGetListing['CategoryPath']"
    )
SQL;

将 用于数组

2-出于安全原因使用 pdo 参数绑定

$query = "SELECT * FROM table WHERE something = ?";
$stmt = $db->prepare($query);
$stmt->execute(array($id));

【讨论】:

【参考方案3】:

尝试使用参数查询。

   $handler->query('INSERT INTO tm_products(title, description, member_name, category_path) VALUES
    (:title, :description, :member_name, :cat_path)', array('title'=>$apiGetListing['Title'],'description'=>$description,'member_name'=>$member_name,'cat_path'=>$apiGetListing['CategoryPath'])) 

或者您可以像这样将变量放入查询中:

"VALUES ('$apiGetListing[Title]','$description','$member_name','$apiGetListing[CategoryPath]'));"

请注意,如果您这样做,则不必将“ ”放入数组键。

【讨论】:

注意第二种方法;这是一个非常糟糕的主意,很可能导致 SQL 注入 如果您要建议使用准备好的参数化查询,那么您最好向 OP 展示如何准备、绑定和执行查询

以上是关于PDO SQL 使用 " 和 ' 输入文本字段的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用 PDO 来清理我的 Sql 查询还是“mysql_real_escape_string”就足够了? [复制]

php+mysql 请问:用pdo如何获取某个表中记录的数目?

php+mysql 请问:用pdo如何获取某个表中记录的数目?

将 PDO 与 MS SQL 结合使用“活动结果不包含任何字段”

pdo 执行sql

Laravel 8:调用 DB::unprepared($sql) 时出现 ErrorException::("PDO::exec(): MySQL server has gone away