Mysql не получать несколько строк с одинаковым значением поля - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть две таблицы: категории и модели. На данный момент важна таблица категорий.

| 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 результата, отсутствует последний , Я знаю, что причина в том же имени, что и в строке id = 2, но как получить все строки в результате? Я пробовал, пока внутри, но это не работает, как я думал.

1 Ответ

2 голосов
/ 19 февраля 2020

Это потому, что вы выбираете дважды;

$row_model = mysqli_fetch_assoc($result_model);

и

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

Первый раз получает один ряд, второй получает остальные. Рефакторинг вашего кода, чтобы использовать выборку только один раз. Вероятно, вы можете удалить весь этот блок кода:

$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 l oop:

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>');
}

Предупреждение!

Маленький Бобби говорит ваш сценарий подвержен риску SQL Атаки с помощью инъекций. Узнайте о подготовленных инструкциях для MySQLi . Даже экранирование не безопасно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...