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语法只有两种类型的引号问题? [复制]的主要内容,如果未能解决你的问题,请参考以下文章