2010-09-30 5 views
0

Я пытаюсь выполнить следующий скрипт (безуспешно):PDO выборки в пределах выборки ошибки

$variables = $db->query("SELECT * FROM table1 WHERE Session_ID = '$sess1'"); 

while($row = $variables->fetch()) { 

//FETCH DATA 
$id= $row["ID"]; 
$info = $db->query("SELECT * FROM table2 WHERE ID = $id"); 

while($row2 = $info->fetch()) { 
    $name = $row2["FNAME"]." ".$row2["LNAME"]; } 
    $phone = $row2["PHONE"]; 
} 

//SEND CUSTOMER EMAIL 
require("../email/email.php");      
} 

это возвращает ошибку: Фатальная ошибка: Вызов функции-члена выборки() на не-объект в ...

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

Любые идеи?

ответ

0

Насколько я могу судить, вы должны принести всех результатов от результирующего, прежде чем выпустить новый запрос. Если вы используете MySQL, вы можете обойти это, вызвав $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);, но я бы советовал ему, так как это делает ваш код менее портативным, а на основных плюсах PDO - абстракцией базы данных.

+0

Thanks Wrikken - Мне не нравится мое решение, но его довольно быстро и работает, поэтому я пойду с ним сейчас, я думаю! – JM4

+0

Примечание: я знаю, что с mysqli вы можете использовать сохраненные результаты (возможно, вы можете с PDO, но я еще не смог его найти) – JM4

+0

Эти «сохраненные результаты», вероятно, такие же, как «MYSQL_ATTR_USE_BUFFERED_QUERY», он хранит/буферизирует набор результатов для последующего использования, освобождая соединение с базой данных для следующего запроса, по крайней мере, насколько я понимаю их работу. – Wrikken

0

попробовать это вместо

//prepare the query 
    $variables = $db->prepare("SELECT * FROM table1 WHERE Session_ID = :sess1"); 
    $info = $db->prepare("SELECT * FROM table2 WHERE ID = :ID"); 

    //bind the variable :sess1 to $sess1 
    $variables->bindParam(':sess1', $sess1, PDO::PARAM_STR); 

    //execute the query 
    $variables->execute; 

    //fetch the result 
    $result = $variables->fetch(PDO::FETCH_ASSOC); 

    //set $result['ID'] to a variable and bind it to the variable :ID in our second query 
    $id = $result['ID']; 
    $info->bindParam(':ID', $id, PDO::PARAM_INT); 

    while($row2 = $info->fetch()) { 
     $name = $row2["FNAME"]." ".$row2["LNAME"]; } 
     $phone = $row2["PHONE"]; 
    } 

    //SEND CUSTOMER EMAIL 
    require("../email/email.php");      
    } 
+0

К сожалению, нет-go; Ошибка анализа: синтаксическая ошибка, неожиданный T_ECHO, ожидающий T_CATCH – JM4

+0

Erm, насколько я вижу, вы только изменяете запросы в подготовленных операциях (это нормально, но рядом с точкой) + забываете вызвать 'execute'. Как это решит проблему? – Wrikken

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