Я думаю, что у вас есть ряд проблем, в основном в вашем коде, который обрабатывает чтение значений, возвращаемых запросом.Я позволил себе сменить несколько вещей и переписать их, чтобы использовать операторы подготовки, что является функцией, которую предоставляет 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);
}