【问题标题】:Mysql do not fetch multiple rows with same field valueMysql不获取具有相同字段值的多行
【发布时间】:2020-02-19 13:11:09
【问题描述】:

我有两个表:类别和模型。目前,类别表很重要。

| id | nazwa | desc_s1 | photo | active | id_user |
|  1 | Audi  |   test  |  url  |   1    |    2    |
|  2 | BMW   |   test  |  url  |   1    |    2    |
|  3 | Ford  |   test  |  url  |   1    |    2    |
|  4 | BMW   |   test  |  url  |   1    |    2    |

我有 php:

$query_categories = "SELECT * FROM `categories` WHERE nazwa='$selected_category' AND active=1 AND id_user=".$_SESSION['id_user'].";";
$query_model = "SELECT * FROM models WHERE active=1";

$result_categories = mysqli_query($con, $query_categories);
$result_model = mysqli_query($con, $query_model);

if (mysqli_num_rows($result_categories) > 0 && mysqli_num_rows($result_model) > 0) {

    $row_categories = mysqli_fetch_assoc($result_categories);
    $selected_category =  $row_categories['nazwa'];
    $_SESSION['selected_category'] = $selected_category;
    $_SESSION['title_content'] = $title_content;
    $_SESSION['price'] = $price;
    $category =  $row_categories['nazwa'];
    $desc_s1 =  $row_categories['desc_s1'];
    $photo =  $row_categories['photo'];

    $row_model = mysqli_fetch_assoc($result_model);
    $selected_model =  $row_model['model'];
    $stan =  $row_model['stan'];
    $przeznaczenie =  $row_model['przeznaczenie'];
    $kolor =  $row_model['kolor'];
    $typ =  $row_model['typ'];

    $table = array();
    do  
    {
        array_push($table, '
            <tr>
            <td class="text-left">353</td>
            <td class="text-left">Stan|' . $row_model['stan'] . '<br />Przeznaczenie|' . $row_model['przeznaczenie'] . '<br />Kolor|' . $row_model['kolor'] . '<br />Typ|' . $row_model['typ'] . '<br /></td>
            <td class="text-left">' . str_replace(' ', '_', $row_model['model']) . '<br /></td>
            <td class="text-left">' . $title_content . ' ' . $selected_category . ' ' . $row_model['model'] . '</td>
            <td class="text-left">' . $price . '</td>
            <td class="text-left">' . nl2br($row_categories['photo']) . '</td>
            <td class="text-left">' . nl2br(htmlspecialchars($row_categories['desc_s1'])) . '</td>
            </tr>');
    } while ($row_model = mysqli_fetch_array($result_model));
} else {
    array_push($errors, '<span class="badge badge-warning">Error</span>');
}

它的工作但是,输出表给了我 3 个结果,缺少的是最后一个。我知道原因是与 row id=2 一样的名称,但是如何获取结果中的所有行?我尝试了 while inside while,但它并没有像我想象的那样工作。

【问题讨论】:

  • 您的代码易受 SQL 注入攻击。您应该使用准备好的语句。
  • 你为什么使用do/while?只需使用 foreach。

标签: php mysql mysqli


【解决方案1】:

这是因为你取了两次;

$row_model = mysqli_fetch_assoc($result_model);

while ($row_model = mysqli_fetch_array($result_model));

第一次获得一行,第二次获得其余的。重构您的代码以仅使用一次 fetch。您可能可以删除整个代码块:

$row_model = mysqli_fetch_assoc($result_model);
$selected_model =  $row_model['model'];
$stan =  $row_model['stan'];
$przeznaczenie =  $row_model['przeznaczenie'];
$kolor =  $row_model['kolor'];
$typ =  $row_model['typ'];

而不是像你在这里看到的do...while

do  
    {
        array_push($table, '
            <tr>
            <td class="text-left">353</td>
            <td class="text-left">Stan|' . $row_model['stan'] . '<br />Przeznaczenie|' . $row_model['przeznaczenie'] . '<br />Kolor|' . $row_model['kolor'] . '<br />Typ|' . $row_model['typ'] . '<br /></td>
            <td class="text-left">' . str_replace(' ', '_', $row_model['model']) . '<br /></td>
            <td class="text-left">' . $title_content . ' ' . $selected_category . ' ' . $row_model['model'] . '</td>
            <td class="text-left">' . $price . '</td>
            <td class="text-left">' . nl2br($row_categories['photo']) . '</td>
            <td class="text-left">' . nl2br(htmlspecialchars($row_categories['desc_s1'])) . '</td>
            </tr>');
    } while ($row_model = mysqli_fetch_array($result_model));

将其更改为 while 循环:

while ($row_model = mysqli_fetch_array($result_model))
{
    array_push($table, '
        <tr>
        <td class="text-left">353</td>
        <td class="text-left">Stan|' . $row_model['stan'] . '<br />Przeznaczenie|' . $row_model['przeznaczenie'] . '<br />Kolor|' . $row_model['kolor'] . '<br />Typ|' . $row_model['typ'] . '<br /></td>
        <td class="text-left">' . str_replace(' ', '_', $row_model['model']) . '<br /></td>
        <td class="text-left">' . $title_content . ' ' . $selected_category . ' ' . $row_model['model'] . '</td>
        <td class="text-left">' . $price . '</td>
        <td class="text-left">' . nl2br($row_categories['photo']) . '</td>
        <td class="text-left">' . nl2br(htmlspecialchars($row_categories['desc_s1'])) . '</td>
        </tr>');
}

警告!

Little Bobbyyour script is at risk for SQL Injection Attacks. 了解 preparedMySQLi 的声明。即使escaping the string 也不安全!

【讨论】:

  • 是的,我明白了,但是它对类别表的最后一行没有任何影响,以及为什么它没有显示(原因是与第2行名称相同但名称不能更改)
  • 你能澄清一下吗?你说的没有道理。
  • 我仍然没有得到最后一行
  • 您是否注释掉或删除了该代码块?请参阅我的更新答案。
  • @Dharman,谢谢,foreach 里面的 foreach 解决了我的问题 :)
猜你喜欢
  • 2018-10-05
  • 2013-03-31
  • 2016-02-12
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多