Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL语法只有两种类型的引用问题?_Php_Html_Mysql_Sql_Mysqli - Fatal编程技术网

Php SQL语法只有两种类型的引用问题?

Php SQL语法只有两种类型的引用问题?,php,html,mysql,sql,mysqli,Php,Html,Mysql,Sql,Mysqli,我有下面一行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 =

我有下面一行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'].'%'";
有什么指导吗?这个语法对我来说太复杂了,尽管我尽了最大的努力


谢谢,

在连接之前,您必须以开始的任何内容结束引号。因此,既然字符串是以
开头的,那么在连接
$\P…
之前,应该以
结尾。您的线路应该是:

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

请注意,将变量从
$\u POST
直接传递到db以避免SQL注入是错误的。

在连接之前,必须以开头的任何内容结束引号。因此,既然字符串是以
开头的,那么在连接
$\P…
之前,应该以
结尾。您的线路应该是:

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

请注意,将变量从
$\u POST
直接传递到db以避免SQL注入是错误的。

您将引号和双引号混合在一起

$sql = "SELECT id, name, price, location FROM products WHERE name LIKE '%".$_POST['search']."%'";
但是,您的代码非常不安全。正如注释中所建议的,您应该使用准备好的语句来避免SQL注入

例如,使用PDO():

$pdo=new pdo();//查看手册以了解如何构建dsn
$query=$pdo->prepare(“从产品中选择id、名称、价格、位置,其中名称如:searchTerm”);
$query->execute([':searchTerm'=>“%”)$\u POST['search'.“%”);

您正在混合使用引号和双引号

$sql = "SELECT id, name, price, location FROM products WHERE name LIKE '%".$_POST['search']."%'";
但是,您的代码非常不安全。正如注释中所建议的,您应该使用准备好的语句来避免SQL注入

例如,使用PDO():

$pdo=new pdo();//查看手册以了解如何构建dsn
$query=$pdo->prepare(“从产品中选择id、名称、价格、位置,其中名称如:searchTerm”);
$query->execute([':searchTerm'=>“%”)$\u POST['search'.“%”);

这是更好的选择:

$sql = "SELECT id, name, price, location FROM products WHERE name LIKE ?";
然后准备该语句,并用附加的通配符绑定该值(
“%$\u POST[search]]”


如果要将带有字符串键的数组放入这样的字符串中(这很好,但不是像其他人指出的那样将用户数据插入SQL字符串),则需要省略键上的引号,除非已将变量括起来。这就是为什么会出现语法错误。并且不需要串联运算符(
),因为变量已经在字符串中

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


但实际上,不管怎样,这都不是SQL的发展方向,仅供参考如何使用字符串。

这是更好的选择:

$sql = "SELECT id, name, price, location FROM products WHERE name LIKE ?";
然后准备该语句,并用附加的通配符绑定该值(
“%$\u POST[search]]”


如果要将带有字符串键的数组放入这样的字符串中(这很好,但不是像其他人指出的那样将用户数据插入SQL字符串),则需要省略键上的引号,除非已将变量括起来。这就是为什么会出现语法错误。并且不需要串联运算符(
),因为变量已经在字符串中

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


但实际上,不管怎样,这都不是SQL的方法,只是为您提供如何使用字符串的参考。

看起来您正在使用SQL字符串内部的
进行PHP类型连接,这是行不通的。您的代码可能会受到相关攻击。请学会使用。使用准备好的语句(参数化查询)也将帮助您摆脱使用哪些引号的困扰!和/或看起来您正在使用SQL字符串中的
进行PHP类型连接,但这不起作用。您的代码可能会受到相关攻击。请学会使用。使用准备好的语句(参数化查询)也将帮助您摆脱使用哪些引号的困扰!和/或请先放置占位符版本。其他的完全不安全,非常危险,只能从安全角度进行讨论。“修复”它们只会产生问题。@tadman说得对。我决定让示例不使用SQL,只是为了更好的衡量。谢谢。人们通常会抓住第一件看起来有效的事情,所以把最好的代码放在第一位很重要。请把占位符版本放在第一位。其他的完全不安全,非常危险,只能从安全角度进行讨论。“修复”它们只会产生问题。@tadman说得对。我决定让示例不使用SQL,只是为了更好的衡量。谢谢。人们通常会抓住第一件看起来有效的事情,所以把最好的代码放在第一位很重要。这不仅是错误的,也是危险的,所以这个快速修复实际上产生了比它解决的更多的问题。它不仅是错误的,它是危险的,所以这个快速修复实际上产生了比它解决的更多的问题。