2016-08-08 2 views
0

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

<!-- language: php --> 
<?php 
$query = "SELECT username FROM users WHERE user_id = ? LIMIT 1"; 
$stmt = $con->prepare($query) or die(mysqli_error($con)); 
$stmt->bind_param("s", $user_id); 
$stmt->execute(); 
$stmt->store_result(); 
$stmt->bind_result($username); 
?> 

Когда я вызываю его в первый раз на странице, он загружается нормально, и данные показывают как следует.

<!-- language: php --> 
<?php 
    // This one works fine. 
     while ($stmt->fetch()){ 
     echo 'Welcome '.$username; 
     } 
    ?> 

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

<!-- language: php --> 
<?php 
// When re-used somewhere else on the page, it fails. Nothing shows. 
    while ($stmt->fetch()){ 
    echo 'Welcome '.$username; 
    } 
?> 
+0

Присвоить результат переменной и использовать эту переменную. – frz3993

+0

Можете ли вы подробнее рассказать? где в коде должно это происходить? –

+0

Используя '$ result = mysqli_fetch_all ($ result, MYSQLI_ASSOC);', вы можете использовать переменную '$ result' впоследствии. Очень похоже на некоторые ответы ниже. – frz3993

ответ

0

мне нужно разделить код для достижения того, что мне нужно было с MySQL (I). Спасибо за ваши данные.

<?php 
// Preparing the statement 
$query = "SELECT username FROM users WHERE user_id = ? LIMIT 1"; 
$stmt = $con->prepare($query) or die(mysqli_error($con)); 
$stmt->bind_param("s", $user_id); 
$stmt->store_result(); 
?> 


<?php 
// Executing it when needed and creating some variables for later re-use 
    $stmt->execute(); 
    $stmt->bind_result($username); 
    while ($stmt->fetch()) { 
    $new_username = $username; 
    echo 'Welcome '.$new_username; 
    } 
?> 

<?php 
// It is possible now to re-use the same result set 
    echo 'Welcome '.$new_username; 
?> 
1

fetch возвращается одна строка за другой. После того, как вы выберете все строки, дальнейший вызов метода fetch() вернет false.

Чтобы получить тот же результат, вам необходимо вернуть запрос execute(). Тем не менее, это снова вызовет базу данных вызовов. Если вы хотите кэшировать результат, вам нужно поместить его в кеш-память/глобальную переменную в памяти/независимо от того, что вы предпочитаете.

Если вы действительно хотите, чтобы добраться до начала результирующего набора снова, вы можете использовать mysqli_data_seek() для этого:

mysqli_data_seek($stmt, 0); 
while ($stmt->fetch()){ 
    echo 'Welcome '.$username; 
} 
+0

mysqli_data_seek дал мне тот же результат, первая работа, вторая - нет. Я уже пытался с повторным выполнением при каждом вызове, но тот же результат. Использование этих 3 методов до сих пор приводит к такому же результату. (Первоначальный выпуск) –

0

Вы могли бы вытащить результат запроса в массив с fetchAll

$users = $stmt->fetchAll(); 

// this works 
foreach($users as $user) { 
    echo 'Welcome ' . $username; 
} 

// this works again 
foreach($users as $user) { 
    echo 'Welcome ' . $username; 
} 

Больше информации здесь: http://php.net/manual/fr/pdostatement.fetchall.php

0

Что вы можете сделать, так это получить результат как ASSOC Array и сохраните результат в переменной. Теперь вы можете использовать этот массив столько раз, сколько хотите.

Обновить код, как это,

$stmt->setFetchMode(PDO::FETCH_ASSOC); 
$results = $stmt->fetchAll(); 

foreach ($results as $r) { 
    //first time use 
} 

foreach ($results as $r) { 
    //second time use 
} 
0

Вы можете сохранить результаты:

<? 
$query = "SELECT username FROM users WHERE user_id = ? LIMIT 1"; 
$stmt = $con->prepare($query) or die(mysqli_error($con)); 
$stmt->bind_param("s", $user_id); 
$stmt->execute(); 
$stmt->store_result(); 
$stmt->bind_result($col['username']); 

$result = array(); 
for ($i = 0; $i < $stmt->num_rows; $i++){ 
    $stmt->data_seek($i); 
    $stmt->fetch(); 
    foreach ($col as $key => $value){ 
     $result[$i][$key] = $value; 
    } 
} 
?> 
Смежные вопросы