PDO не возвращает результаты из SELECT для более чем 1 столбца - PullRequest
0 голосов
/ 08 февраля 2011

Сервер работает под управлением PHP 5.2.8.На PDO установлены драйверы mysql 5.1.30.

Хорошо, поэтому я пытаюсь выяснить некоторые 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

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

Блок перехвата не генерирует никаких исключений.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

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

При подготовке операторов:
Зачем их использовать: http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html
PHP PDO doc: 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          

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

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

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

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

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

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

//bind parameters to the prepared statement
$param = array(':lastname'=>'Jones');
foreach ($param as $key => $value) {
  $qresult->bindValue($key,$value);
  }
0 голосов
/ 09 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...