【问题标题】:mysqli_fetch_assoc() inside loop gets only first row result from WHERE IN query循环内的 mysqli_fetch_assoc() 仅从 WHERE IN 查询中获取第一行结果
【发布时间】:2019-08-13 15:35:39
【问题描述】:

我正在使用SELECT * FROM products WHERE id IN ('$arrayImplodedToStr') SQL 查询同时从数据库中获取多个值。查询工作正常,因为当我回显$q 时,我可以看到所有数组项都转换为查询中的 id 号,并且其中有很多。但是当我进行查询并将其存储在数组中,然后在while 循环中使用mysqli_fetch_assoc() 从查询中获取所有行时,我总是只得到一个和第一个项目。不知道为什么?

代码:

session_start();
require_once('navigation.php');
require_once('database_connection.php');

if(empty($_SESSION['cart'])) {
    $_SESSION['cart'] = array();
}

array_push($_SESSION['cart'], $_GET['product_id']);
$arrayImplodedToStr = implode(',', $_SESSION['cart']);

$q = "SELECT * FROM products WHERE id IN ('$arrayImplodedToStr')";

$result = mysqli_query($dbc, $q);
mysqli_query($dbc, $q);
$allRows = [];

while($row = mysqli_fetch_assoc($result)) {
    $allRows[] = $row;
}

foreach ($allRows as $cartItems) {
    echo $cartItems['name'];
}

【问题讨论】:

  • 您的查询将类似于"SELECT * FROM products WHERE id IN ('1,2,3,4,5')",这是不正确的。您需要在 implode 中添加单引号。

标签: php mysql sql loops mysqli


【解决方案1】:

您不希望在数组字符串周围加上引号。这将使其全部成为一项,并且 - 如果是数字 - 将其截断为找到的第一个。

如果保证单个项目是数字,请删除引号。如果那里可能有文本字符串,则需要引用字符串中的每个单独项目,例如 'a', 'b', 'c' 而不是 'a, b, c'

【讨论】:

  • 仅限数字,删除单引号会中断查询
  • 就像你说的,它是用引号括起来的,而不是用引号括起来的单个项目。通过在 implode 函数内的 glue 参数周围添加外部引号来修复它,如下所示:implode("','", $_SESSION['cart']);
  • 是的,完全一样。但如果所有值都是整数,则没有必要。哦,好吧,你有它的工作吗?
  • @Limpuls 如果您删除$arrayImplodedToStr 周围的单引号,则不必在内爆中添加单引号。这就是这个答案的重点。
【解决方案2】:

你可以使用

$result = mysqli_fetch_all($mysqli->query($query)

【讨论】:

  • 我需要关联数组。没有面向对象
猜你喜欢
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
相关资源
最近更新 更多