【问题标题】:Problems with sql query in phpphp中sql查询的问题
【发布时间】:2020-05-14 14:27:53
【问题描述】:

所以,我正在使用一个查询来获取个人资料照片,我正在使用以下查询:

$sql = "SELECT photo FROM users WHERE login = '$username'";

我已经尝试了很多方法,有和没有引号。

$sql = "SELECT `photo` FROM `users` WHERE `login` = '$username'";

接下来的代码是这样的:

$result = mysqli_query($link, $sql);
echo "<script>console.log('photo: ".$sql."');</script>";

当我检查控制台时,我看到了这个错误: Uncaught SyntaxError: missing ) after argument list

当我只使用“从用户中选择照片”进行查询时,它会返回一个值。

在另一个页面上,我使用相同的代码来获取权限并返回我想要的值

$sql = "SELECT permission FROM users where login = '$username'";
$result = mysqli_query($link, $sql);
   if ($result->num_rows > 0) {
        while ($row = mysqli_fetch_array($result)) {
        $save = $row[0];
        }
    }

权限列是 int;

照片栏是varchar;

【问题讨论】:

  • 在浏览器中查看源码。您正在将查询字符串传递给您的 console.log。尽管即使您尝试传入$result,也会收到错误消息,因为$result 是mysqli_result,而不是photo
  • 我知道,我只是想检查我的查询,看看查询是对还是错。
  • 你应该学会使用准备好的语句来防止 SQL 注入。
  • 这可能是个好主意,但您可能希望将其记录到服务器。当您像这样将查询传递给 javascript 时,它看起来像 &lt;script&gt;console.log('photo: SELECT `photo` FROM `users` WHERE `login` = '$username'');&lt;/script&gt;,正如您所看到的那样,它会搞砸单引号。这就是导致 javascript 错误的原因。

标签: php mysql query-string


【解决方案1】:

由于查询包含单引号,您不能在 console.log() 的参数周围使用单引号,因为查询中的引号将终止 JavaScript 字符串。

在 JS 字符串两边加上双引号。

echo "<script>console.log(\"photo: ".$sql."\");</script>";

【讨论】:

  • 虽然这确实解决了直接问题,但请参阅我的回答,了解为什么首先不应出现此问题。 :-)
  • 我在调试时一直使用echo $sql;var_dump($row); 之类的东西。我发现它比将其发送到错误日志更方便。当然它不应该在生产代码中。
  • 感谢@Barmar,你帮助了我,我可以看到我的 SQL,我注意到我没有变量,$username 对。
【解决方案2】:

您的 javascript 控制台包含在 ' 引号中,而您的 '$username' 值也使用这些单引号,所以这会导致问题。

因此;如果要将此 SQL 字符串导出到控制台,则需要转义这些单引号或在 javascript 中使用替代引号。

Barmar's Answer 可以更好地解决这个问题。

但是:

最佳实践;您应该将 SQL 字符串输出到浏览器。这是一个潜在的严重安全漏洞。相反(特别是如果您的 SQL 服务器是 'localhost'),您应该将 SQL 数据输出到 PHP 错误日志:

 $result = mysqli_query($link, $sql);
 //echo "<script>console.log('photo: ".$sql."');</script>";
 error_log("Query Output: ".print_r($sql,true));

然后在您的 IDE 或安全服务器连接(SFTP 等)中,您可以访问 PHP 错误日志并更安全地查看 SQL。

另见:Where does PHP store the error log? (php5, apache, fastcgi, cpanel)

【讨论】:

  • 我只是使用控制台,因为它更快,而且我在发布网页时总是删除所有控制台命令,但感谢您的提示。
  • @FernandoFilipe 正如所说,是的,它更快,但它不是最佳实践。我希望您的浏览器连接至少受 TLS1.2 保护。
猜你喜欢
  • 2011-07-29
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 2013-11-08
  • 2011-11-07
相关资源
最近更新 更多