2011-02-08 2 views
0

Сервер работает под управлением PHP 5.2.8. В PDO установлены драйверы mysql 5.1.30.PDO не возвращает результаты SELECT на более чем 1 столбец

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

Однако всякий раз, когда я пытаюсь добавить более чем один столбец (или *) в SELECT, ответа нет из запроса - никаких результатов. Я все пробовал - я знаю, что это должно быть что-то простое. Любые предложения относительно того, почему более одного столбца не может вернуть какой-либо строки?

$hostname = "localhost"; 
$dbname = "dbname"; 
$username = "username"; 
$password = "password"; 
try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    /*** echo a message saying we have connected ***/ 
    echo 'Connected to database<br />'; 

    /*** The SQL SELECT statement ***/ 
    $sql = "SELECT LastName FROM staff"; 
    foreach ($dbh->query($sql) as $row) { 
     echo $row['LastName'] . '<br />'; 
    } 

    /*** close the database connection ***/ 
    $dbh = null; 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

Опять же, если я пытаюсь добавить столбцы в отчете, хранящегося в $ SQL к чему-либо, кроме одного столбца, я получаю bupkis. Например :

SELECT FirstName, LastName FROM staff 

возвращает нулевые результаты. Оба столбца существуют - если запрашивается отдельно, они возвращают ожидаемые результаты. При объединении запрос занимает довольно много времени, а затем ничего не возвращает.

Исключением не является ловушка.

+0

Пожалуйста, включите PDO сообщений об ошибках от бесшумного к исключению. Это, вероятно, поможет. – NikiC

+0

У вас есть ошибка? Или запрос просто возвращается пустым? – Cfreak

+0

@Cfreak - никаких ошибок. – gradatc

ответ

2

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

На готовят заявления:
Почему их использовать: http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html
PHP PDO документ: http://php.net/manual/en/pdo.prepare.php

Вот основной код:

try { 
    //open database 
    $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); 

    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    //define sql query 
    $sql = "SELECT LastName FROM staff"; 

    //prepare the query for execution 
    $qresult = $dbh->prepare($sql); 

    //insert code below to handle parameters to the sql query here 

    //execute the query 
    $qresult->execute(); 

    //fetch the results 
    foreach ($qresult->fetch(PDO::FETCH_ASSOC) as $row) 
    { 
    echo $row['LastName'] . '<br />'; 
    } 


} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 

$qresult = null; //close the result set 
$dbh = null; //close the database   

Обратите внимание, что я заменил вызов запроса () с несколькими строками, которые вызывают метод prepare(), а затем execute(). Затем вы можете легко вставить следующие строки между вызовами prepare() и execute() для обработки передаваемых параметризованных запросов. Это поможет снизить вероятность внедрения sql.

Я также изменил способ доступа к восстановленному значению, указав, что я хочу, чтобы они возвращались как и ассоциативный массив, PDO :: FETCH_ASSOC. Это даст вам набор результатов, который вы можете выполнить итерацией, как если бы вы использовали старые интерфейсы mysql.

Если запрос был параметризованные запросы, как:

$sql="SELECT LastName FROM staff WHERE LastName=':lastname'"; 

где: Lastname является параметром.

Вот код, который вы бы вставить в комментарии справиться с этим, (этим кодом будет работать с несколькими параметров Просто добавить дополнительные элементы в массив $ паров.):

//bind parameters to the prepared statement 
$param = array(':lastname'=>'Jones'); 
foreach ($param as $key => $value) { 
    $qresult->bindValue($key,$value); 
    } 
+0

Спасибо за информацию о параметризованном запросе. Я не использовал его, потому что это был вызов SELECT без каких-либо переменных входов. Я попробовал ваш код, который возвращает букву «W» - и все. Он тоже не справляется с чем-то большим, чем один запрос столбца в инструкции SELECT. Опять же, старый mysqli работает без проблемы ... странно. Но еще раз спасибо за ввод. Если я когда-нибудь это выясню, я обязательно перейду к коду еще этого стиля. – gradatc

+0

$ sql = "SELECT s.LastName, s.FirstName FROM staff s" shoudl возвращает оба. Помните, что в цикле вам нужно добавить еще $ row ['rownname']. Надеюсь, это поможет. –

0

Обязательно разделяйте столбцы в SELECT запятой (пробел по обе стороны от запятой в порядке, но не требуется). Если вы хотите выбрать все столбцы, используйте только * без других символов.

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