【问题标题】: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\" "?

处结束查询

【问题讨论】:

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

标签: php mysql sql pdo


【解决方案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 展示如何准备、绑定和执行查询
      猜你喜欢
      • 2011-04-11
      • 1970-01-01
      • 2015-07-08
      • 2016-06-10
      • 2014-11-24
      • 2011-07-14
      • 2020-05-18
      • 1970-01-01
      • 2012-06-30
      相关资源
      最近更新 更多