SQL语法只有两种类型的引号问题? [复制]

Posted

技术标签:

【中文标题】SQL语法只有两种类型的引号问题? [复制]【英文标题】:SQL syntax only two types of quotations issue? [duplicate] 【发布时间】:2018-10-18 18:56:23 【问题描述】:

我有以下 php 行,其中设置了连接和所有内容。它给了我以下错误:

( ! ) Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\UwAmp\www\dxlphin\index.php on line 174

代码如下:

$sql = "SELECT id, name, price, location FROM products WHERE name LIKE '%'.$_POST['search'].'%'";

有什么指导吗?尽管我尽了最大努力,但这种语法对我来说太复杂了......

谢谢,

【问题讨论】:

看起来您正在使用 SQL 字符串中的 . 进行 PHP 类型的连接,这是行不通的。 你的代码对SQL injection相关的攻击是开放的。请学会使用Prepared Statements。 使用准备好的语句(参数查询)也将帮助您摆脱弄清楚要使用哪些引号! 和/或***.com/questions/60174/… 【参考方案1】:

这是更好的选择:

$sql = "SELECT id, name, price, location FROM products WHERE name LIKE ?";

然后准备该语句并将值与附加的通配符绑定 ("%$_POST[search]%")。


如果您要将带有字符串键的数组放入这样的字符串中(这很好,但不适用于将用户数据插入 SQL 字符串,正如其他人也指出的那样)您需要省略引号键上,除非您将变量括起来。这就是您收到语法错误的原因。并且连接运算符 (.) 不是必需的,因为变量已经在字符串中。

$string = "some text '$array[key]' and so on";

$string = "some text '$array['key']' and so on";

但实际上,无论如何这都不是 SQL 的方式,仅供参考如何使用字符串。

【讨论】:

请先放占位符版本。其他的则完全危险,不安全,只能从安全角度进行讨论。 “修复”它们只会产生问题。 @tadman 好点。我决定让示例也不是 SQL,只是为了更好地衡量。 谢谢。人们通常会抓住第一件看起来可以工作的东西,所以把最好的代码放在第一位很重要。【参考方案2】:

你把引号和双引号混在一起了

$sql = "SELECT id, name, price, location FROM products WHERE name LIKE '%".$_POST['search']."%'";

但是,您的代码非常不安全。正如 cmets 中所建议的,您应该使用准备好的语句来避免 SQL 注入。

例如,使用 PDO (http://php.net/manual/en/class.pdo.php):

$pdo = new PDO(<dsn>); // Check the manual to see how to build your dsn
$query = $pdo->prepare("SELECT id, name, price, location FROM products WHERE name LIKE :searchTerm");
$query->execute([':searchTerm' => "%" . $_POST['search'] . "%"]);

【讨论】:

【参考方案3】:

在连接之前,您必须以开头的任何内容结束引号。因此,由于您的字符串以" 开头,因此您应该在连接.$_P... 之前以" 结束它。你的行应该是:

$sql = "SELECT id, name, price, location FROM products WHERE name LIKE '%".$_POST['search']."%'";

请注意,将变量从$_POST 直接传递到数据库以避免SQL 注入是错误的。

【讨论】:

这不仅是错误的,而且是危险的,所以这个快速修复实际上带来的问题比它解决的要多。

以上是关于SQL语法只有两种类型的引号问题? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中何时何地使用单引号? [复制]

JaveScript初学-基础语法

SQL中单引号和双引号有啥用? [复制]

JS 语法大全

如果我使用双引号在 SQL 数据库表中插入字符串,这有啥关系? [复制]

Python基础语法总结