#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
?>