【问题标题】:How to run an sql query inside a while loop of another query如何在另一个查询的while循环中运行sql查询
【发布时间】:2014-12-09 15:12:19
【问题描述】:

当 photoId 直接在语句上而不是变量时,以下工作完全没有问题。

$img_query = mysqli_query($con, 'SELECT * FROM imgs WHERE photoid = "103"') or die(mysqli_error($con));

但以下内容无法正常工作,可能会导致无法选择。

$imageid = '103';
$img_query = mysqli_query($con, 'SELECT * FROM imgs WHERE photoid = "$imageid"') or die(mysqli_error($con));
$img_row = mysqli_fetch_array($img_query);
    echo $img_row['img'];

这是在一个while循环中。

while($row = mysqli_fetch_array($somequery)){
 $imageid = $row['photoid'];
    $img_query = mysqli_query($con, 'SELECT * FROM imgs WHERE photoid = "$imageid"') or die(mysqli_error($con));
    $img_row = mysqli_fetch_array($img_query);
        echo $img_row['img'];
}

谢谢。

【问题讨论】:

  • 当使用mysqli 时,您应该使用参数化查询和bind_param 将用户数据添加到您的查询中。 请勿使用字符串插值来完成此操作,因为您将创建严重的SQL injection bugs
  • 您可能不应该在循环中运行 sql 查询。使用JOIN 通常效率更高。
  • @jeroen 我很想加入,你能根据我的问题举个例子吗?
  • 您还需要发布第一个查询。

标签: php mysql sql while-loop nested


【解决方案1】:

在 php 中,'" 非常不同,查询语法是查询周围的双引号和变量周围的单引号.. 虽然我建议您查看在查询中使用参数而不是仅仅放置一个变量直接进入查询

根据我的建议,您应该将查询更改为:

$imageid = '103';
$query = $con->prepare("SELECT * FROM imgs WHERE photoid = ?");
$query->bind_param('sssd', $imageid);
$query->execute();

这只是细节...如果您想了解有关连接的更多信息...错误处理和其他所有内容请阅读DOCS

【讨论】:

  • 这将一段无害的代码变成了 SQL 注入错误。
  • @tadman 从 OP 使用变量的角度来看,它不会是用户输入......但如果你注意到我的帖子的结尾,我建议 OP 考虑使用参数
  • @Relm 你真的不应该使用单引号。使用我放在那里的准备好的语句......
  • @Relm 好吧,这真的取决于你是否接受用户输入......我会坚持使用参数化查询,因为它们是安全的,并且是所有 sql 查询的目标并且应该完成但是由您决定...如果任何查询都存在任何用户输入,那么您必须使用此方法
  • 对使用参数化查询进行自律意味着逃逸错误的机会非常低。手动转义某些事情总是有风险的,即使您“确定”数据没有问题,也只能作为绝对的最后手段。该数据的来源在未来可能会发生变化,您可能会被大开眼界。
【解决方案2】:

php中'"有很大区别

Differences

将您的查询更改为

$img_query = mysqli_query($con, "SELECT * FROM imgs WHERE photoid = '$imageid'") or die(mysqli_error($con));

它应该可以工作。

【讨论】:

  • 你不应该首先使用字符串插值,所以为了安全起见,使用'' 通常是一个好主意。
猜你喜欢
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 2016-12-18
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
相关资源
最近更新 更多