2012-01-06 3 views
1

Я недавно начал изучать подготовленные заявления и начал настраивать свои сценарии с новым стилем.Невозможно отобразить несколько запросов на одной странице

Однако я столкнулся с небольшой стеной, и я надеюсь, что кто-то может указать мне в правильном направлении?

Вот моя структура SQL запрос:

$query = "SELECT `results`, `Success`, `Failure`, `Counter`, `Grades`, `Classes`, 
`Special_Id`, `SpecialCondition` FROM `Courses` INNER JOIN `Students` ON `id` = 
`Students_Id` JOIN `Conditions` ON `id` = `Special_Id`"; 

$stmt = $Mconn->prepare($query); 
$stmt->bind_result($results, $success, $failed, $counter, $grades, $classes, 
$specialId, $specialcondition); 
$stmt->execute(); 
$stmt->store_result(); 

А вот один блок кода:

<?php 

echo "<select = \"SpecialConditions\">"; 
if($stmt->num_rows == NULL){ 
    echo "No results found."; 
}else{ 
    while($stmt->fetch()){ 

    echo "<option value=\"$specialId\">$specialcondition</option>"; 
} 
} 
echo "</select>"; 
?> 

И еще один блок кода:

<?php 
echo "<select = \"Grades\">"; 
if($stmt->num_rows == NULL){ 
    echo "No results found."; 
}else{ 
    while($stmt->fetch()){ 

     echo "<option value=\"".$grades."\">".$grades."</option>"; 
    } 
} 
echo "</select>"; 

?> 

Хорошо, теперь, что происходит, если я поставил оба эти запроса на одну и ту же страницу, первый блок убьет второй и другой запрос под ним и Я не могу понять, почему, и я исследовал это до конца.

Я попытался закрыть соединение в одном блоке кода, думая, что может сделать трюк, но не превалировать.

Теперь я знаю, что соединение с БД работает, и я знаю, что возвращаемые результаты на самом деле хранятся, потому что, если я тестирую каждый блок на отдельной странице, он работает так, как предполагается.

Заранее благодарю вас за помощь.

ответ

1

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

Вот окончательное решение в случае, если кому-то любопытно или ударит по этой стене в будущем. Если вы знаете способ, который не требует этого метода, сообщите мне.

Моя динамическая функция, которая связывает и запрашивает базу данных:

<?php 

function DB_Query(){ 
$databasefields = array(); 
$results = array(); 

@$Mconn = new mysqli(DBHOST, DBUSER, DBPWRD, DBNAME); 

    if ([email protected]_connect(DBHOST, DBUSER, DBPWRD, DBNAME)){ 
    die(DBERROR); 
    } 

$query = "SELECT `results`, `Success`, `Failure`, `Counter`, `Grades`, `Classes`, 
`Special_Id`, `SpecialCondition` FROM `Courses` INNER JOIN `Students` ON `id` = 
`Students_Id` JOIN `Conditions` ON `id` = `Special_Id`"; 

$stmt = $Mconn->prepare($query); 
$stmt->execute(); 
$meta = $stmt->result_metadata(); 

while($field = $meta->fetch_field()){ 
$databasefields[] = &$row[$field->name]; 
} 

call_user_func_array(array($stmt, 'bind_result'), $databasefields); 
while($stmt->fetch()){ 
    $queried = array(); 
    foreach($row as $key => $vector){ 
     $queried[$key] = $vector; 
    } 

    $results[] = $queried; 
} 

return $results; 
} 

$results = DB_Query(); // placed in DB include file 
?> 

И вот код, я использую на самом деле отображать данные по отдельности или в нескольких блоках. Просто измените имя поля, чтобы оно соответствовало вашему. Функция динамическая и не требует жесткого кодирования любых результатов привязки, поэтому вы можете выбрать столько полей, сколько хотите.

<?php 
foreach($results as $row){ 
echo $row['grades'].'<br />'; 
} 

Благодарим за помощь и надеюсь, что это поможет тем, кто столкнулся с той же проблемой, что и я.

+0

Поздравляем с решением. Когда вы в состоянии, пожалуйста, отметьте свой ответ как «принятый», используя галочку слева. Это позволит другим узнать, что ваша проблема решена. Cheers ~ –

+0

Спасибо и сделаем. – Cryotech

4

Вы должны close the statements, когда вы закончите с ними

$stmt->close(); 

Вы не можете начать новую подготовленное заявление, а еще один остается выдающимся, даже если вы выбрали все свои данные.

+0

Привет, Марк, я попробовал то, что вы предложили, и я все еще не могу отобразить несколько запросов на одной странице. Поэтому я попытался поместить его в оба блока, но когда я разместил $ stmt-> close(); в обоих блоках я получил следующую ошибку: Предупреждение: mysqli_stmt :: close() [mysqli-stmt.close]: Не удалось получить mysqli_stmt – Cryotech

+0

Вы сделали вызов -> close() внутри цикла выборки? Это нужно делать только после завершения цикла выборки и завершения работы. –

+0

Привет, Марк, я не разместил его сразу же за тегом, а также попытался установить его между двумя}} перед окончательным тегом и ничего не работает. Я знаю, что результаты положительные, я просто не могу заставить их отображаться по какой-то причине. – Cryotech

Смежные вопросы