【问题标题】:How to use PHP variables in HEREDOC SQL query?如何在 HEREDOC SQL 查询中使用 PHP 变量?
【发布时间】:2019-08-18 18:35:01
【问题描述】:

我正在尝试使用 HEREDOC 表单在 PHP 中执行 SQL 查询。虽然单行表单可以正常工作,但在 HEREDOC 表单中却不能正常工作。

这是我尝试使用的 HEREDOC 代码:

$sql = <<<SQL
    SELECT *
    FROM `users`, `passwords`
    WHERE users.User_id = passwords.User_id 
    AND {$formusername} = users.User_name
    AND {$formpassword} = passwords.User_password
SQL;

当我知道我通过表单提供的值应该至少产生 1 行时,上述语句返回 0 行。此外,我知道问题出在 AND 语句中,因为删除它们会产生行。我怀疑是我在语句中编写变量的方式导致了问题。

以下语法可以正常工作:

$sql = 'SELECT * FROM users, passwords WHERE users.User_id = passwords.User_id AND "'.$formusername.'" = users.User_name AND "'.$formpassword.'" = passwords.User_password';

为我通过 HTML5 表单提供的值正确返回 1 行。

我的 HEREDOC 语法有什么问题?

编辑:我知道我应该使用准备好的语句来避免 SQL 注入。这只是课堂的一个小例子,我需要 HEREDOC 表单才能工作。

【问题讨论】:

  • 我注意到的一件事是您没有引用 $formusername$formpassword 变量,但它们在您的第二个代码 sn-p 中被引用。尝试像这样添加引号:AND "{$formusername}" =$formpassword 相同
  • ^ 是的,这就是问题所在。由于变量没有被引用,它会将它们解释为列名而不是字符串
  • 防止sql注入,需要使用参数查询

标签: php mysql mysqli heredoc


【解决方案1】:

试试这个:

$sql = <<<SQL
    SELECT *
    FROM `users`, `passwords`
    WHERE users.User_id = passwords.User_id 
    AND "{$formusername}" = users.User_name
    AND "{$formpassword}" = passwords.User_password
SQL;

问题是变量中缺少引号(“), 就像{$formusername} 而不是"{$formusername}"。 希望能解决问题。

【讨论】:

  • 非常感谢。我的语法突出显示让我认为这是不正确的,但它工作得很好。另外,感谢所有指出这个问题的评论员。
猜你喜欢
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2021-03-09
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2019-08-28
相关资源
最近更新 更多