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 附近使用正确的语法
$description
在addslashes()
之后是"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 结合使用“活动结果不包含任何字段”
Laravel 8:调用 DB::unprepared($sql) 时出现 ErrorException::("PDO::exec(): MySQL server has gone away