Выполняется ли цикл этого кода через несколько строк, возвращаемых MySQL?

#php #mysql #debugging

#php #mysql #отладка

Вопрос:

У меня есть PHP-код ниже. Предполагается, что он выбирает до десяти строк из базы данных, берет эту информацию и вводит ее в массивы, определенные выше, для последующего перебора в коде и печати на странице. Предполагается, что он выбирает три строки, но он выбирает только последнюю. Есть идеи, почему?

 //create arrays for storing each tests information
$subject = array();
$tag = array();
$title = array();
$creator = array();
$creation_date = array();
$test_type = array();
$test_id = array();

$q = "SELECT test_id, title, subject, type, creation_date FROM tests WHERE user_id='$user_id' LIMIT 10"; //select first ten of users tests
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $qn<br />MySQL Error: " . mysqli_error($dbc));

if (mysqli_affected_rows($dbc) > 0) //if the query ran correctly and the test details were gathered from the database
{
    $i = 0;

    while($row = mysqli_fetch_array($r, MYSQLI_ASSOC))
    {
        $test_id[] = $row['test_id'];
        $test_type[] = $row['type'];
        $creation_date[] = $row['creation_date'];
        $creator[] = $user_id;
        $title[] = $row['title'];
        $subject[] = $row['subject'];

        $q = "SELECT tag_id FROM test_tags WHERE test_id='$test_id[$i]'"; //selects tags for test
        $r = mysqli_query ($dbc, $q) or trigger_error("Query: $qn<br />MySQL Error: " . mysqli_error($dbc));

        if (mysqli_affected_rows($dbc) > 0) //if the query ran correctly and the tag_ids were gathered from the database
        {
            while($row = mysqli_fetch_array($r, MYSQLI_ASSOC))
            {
                $thisTag = $row['tag_id'];

                $q = "SELECT name FROM tags WHERE tag_id='$thisTag' LIMIT 1"; //selects tag name
                $r = mysqli_query ($dbc, $q) or trigger_error("Query: $qn<br />MySQL Error: " . mysqli_error($dbc));

                if (mysqli_affected_rows($dbc) > 0)//if the query ran correctly and the tags were gathered from the database
                {
                    while($row = mysqli_fetch_array($r, MYSQLI_ASSOC))
                    {
                        $tag[$i][] = $row['name'];
                    }
                }
            }
        }
        $i  ;
    }
}//end of SELECT if
  

Комментарии:

1. Сделайте соответствующий отступ в вашем коде или выполните перебор.

2. Исправлено, ожидание экспертной оценки

3. Вы уверены, что выбираете необходимые 3 строки? Если вы запустите тот же запрос в phpMyAdmin (как пример), возвращает ли он то, что вы хотите, чтобы он вернул? Я просто спрашиваю, потому что довольно часто можно увидеть, как люди ищут проблему где-то в другом месте.

4. @coreyward да, извините за это. Мне действительно нужно привыкнуть это делать. @mazzzzz большое спасибо!

Ответ №1:

Похоже, что вы делаете базу данных «многие ко многим». (это означает, что у вас много записей, связанных со многими тегами).
Две вещи: вы используете одну и ту же переменную строки во всех вложенных запросах, и вы используете ту же переменную результата. следует избегать обоих. Попробуйте приведенный ниже код и расскажите мне, как это работает.

 <?php
//create arrays for storing each tests information
$subject = array();
$tag = array();
$title = array();
$creator = array();
$creation_date = array();
$test_type = array();
$test_id = array();

$q = "SELECT test_id, title, subject, type, creation_date FROM tests WHERE user_id='$user_id' LIMIT 10"; //select first ten of users tests
$r1 = mysqli_query ($dbc, $q) or trigger_error("Query: $qn<br />MySQL Error: " . mysqli_error($dbc));

if (mysqli_affected_rows($dbc) > 0) //if the query ran correctly and the test details were gathered from the database
{
    $i = 0;

    while($orow = mysqli_fetch_array($r1, MYSQLI_ASSOC))
    {
        $test_id[] = $orow['test_id'];
        $test_type[] = $orow['type'];
        $creation_date[] = $orow['creation_date'];
        $creator[] = $user_id;
        $title[] = $orow['title'];
        $subject[] = $orow['subject'];

        $q = "SELECT tag_id FROM test_tags WHERE test_id='{$test_id[$i]}'"; //selects tags for test
        $r2 = mysqli_query ($dbc, $q) or trigger_error("Query: $qn<br />MySQL Error: " . mysqli_error($dbc));

        if (mysqli_affected_rows($dbc) > 0) //if the query ran correctly and the tag_ids were gathered from the database
        {
            while($irow = mysqli_fetch_array($r2, MYSQLI_ASSOC))
            {
                $thisTag = $irow['tag_id'];

                $q = "SELECT name FROM tags WHERE tag_id='{$thisTag}' LIMIT 1"; //selects tag name
                $r3 = mysqli_query ($dbc, $q) or trigger_error("Query: $qn<br />MySQL Error: " . mysqli_error($dbc));

                if (mysqli_affected_rows($dbc) > 0)//if the query ran correctly and the tags were gathered from the database
                {
                    while($iirow = mysqli_fetch_array($r3, MYSQLI_ASSOC))
                    {
                        $tag[$i][] = $iirow['name'];
                    }
                }
            }
        }
        $i  ;
    }
}//end of SELECT if
?>