如果PHP不应该在单引号的字符串内读取,那么为什么它在mysqli_query()中用单引号替换变量值呢?

If PHP isn't supposed to read inside single quoted strings, so why does it substitute variable values in single quotes in mysqli_query()?

提问人:BarbaraRoseNow 提问时间:10/28/2018 最后编辑:BarbaraRoseNow 更新时间:10/29/2018 访问量:52

问:

PHP 不应该在单引号和双引号之间查看字符串。但是,在我的 mysqli 查询字符串中,我将变量放在单引号值列表中,并且它正在工作 - 值在 XAMPP 中从输入形式传输到我的 mysql。这意味着它必须在单引号内对等,以便识别那里有一个变量,并在 mysqli 查询值部分中替换值,但情况不应该如此。

我本来以为只有包含变量的双括号才会被替换到查询中,但实际上恰恰相反 - 它们不起作用!我被迫将它们转换回单引号,这应该行不通,但确实行得通。

例如,mysql查询值部分中的所有PHP变量都是以前从输入html表单中定义的,以下完全有效并将表单数据插入到我的数据库中:

$host = 'localhost';
$user = 'root';
$pw = '';
$db = 'aliensdb';
$dbc = mysqli_connect($host, $user, $pw, $db);
$table = 'alien_abductions';
$query = "INSERT INTO $table (
    first_name, 
    last_name, 
    when_it_happened, 
    how_long, 
    how_many, 
    alien_description, 
    what_they_did, 
    fang_spotted, 
    other, 
    email)
    VALUES (
    '$first_name', 
    '$last_name',
    '$when_it_happened',
    '$how_long',
    '$how_many', 
    '$alien_description', 
    '$what_they_did', 
    '$fang_spotted', 
    '$other', 
    '$email'    
    )";

$result = mysqli_query($dbc, $query) or die('Error querying database.');
mysqli_close($dbc);

这有效并且变量被放入我的数据库中作为新行成功插入的值中,这违反了 PHP 定律 - 或者是吗?在什么情况下,PHP会违反“单括号不解析规则”和/或“双括号被解析”规则?

谢谢:)

php mysql mysqli 引号

评论

0赞 Sami Kuhmonen 10/28/2018
因为这些单引号在双引号内。但永远不要这样做,使用参数。
0赞 Rotimi 10/28/2018
删除此“代码”和 Google 关于如何使用准备好的语句mysqli()
1赞 mickmackusa 10/28/2018
MySQL中何时使用单引号、双引号和反引号可能重复
0赞 BarbaraRoseNow 11/11/2018
不是上面“mickmackusa”提供的帖子/链接的重复 - 不处理这个问题中提出的问题。

答:

2赞 Jonathon Reinhart 10/28/2018 #1

PHP 不会扩展 (PHP) 单引号字符串内的变量。您所拥有的是双引号字符串文本中的单引号,其中它们的处理方式与任何其他字符没有什么不同。

此外,不要对 SQL 查询使用这样的变量替换。使用预准备语句。您容易受到 SQL 注入的攻击。

评论

0赞 BarbaraRoseNow 11/11/2018
因此,PHP 解析嵌套引号的方式与解析嵌套引号的方式不同,例如,使用括号时,情况并非如此,其中解析是一致的,并且会持续到任何嵌套深度。这似乎打破了PHP从不查看单括号的规则,并且应该在PHP手册中注明,但至少现在它在这里供其他人找到。我在网上花了很多时间,可以说除了现在可供其他人使用的这篇文章之外,网上没有容易找到这种不一致的提及。