PHP PDO - может подключиться, но запрос не работает - PullRequest
0 голосов
/ 03 декабря 2011

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

<?php
$host = 'localhost';
$port = '3306'; 
$username = 'user';
$password = 'blabla';
$database = 'workslist';

try {
    $db = new PDO("mysql:host=$host; port = $port; dbname = $database", $username, $password);
    echo 'connection successful<br />';

    $query = 'SELECT * FROM main';
    $statement = $db->prepare($query);
    $statement->execute();
    $results = $statement->fetchAll();
    $statement->closeCursor();      

    foreach($results as $r){
            echo $r['work'] . '<br />';
    }

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

Что-то не так с вышесказанным?

Имя базы данных - «рабочий список», имя таблицы - «основное», а «работа» - один из столбцов в этой таблице. Я использую версию PHP 5.3.4 и использую wamp на win7. Я запустил phpinfo() и под заголовком PDO драйверы PDO mysql, sqlite включены. Чтобы убедиться, что база данных и таблица действительно существуют, я попробовал их с MySQL и могу вернуть строки старым методом mysql_fetch_array(). Я проверил файл php.ini, чтобы убедиться, что строки "extension = php_pdo ..." не закомментированы.

ура

Ответы [ 3 ]

4 голосов
/ 03 декабря 2011

Это должно сработать.

Пожалуйста, еще раз проверьте, что у вас действительно есть таблица с именем "main" в этой базе данных.

Обратите внимание, что эта ошибка не будет обнаружена PDO, пока вы execute() запроса, и если с вашим запросом возникает проблема, по умолчанию возвращается пустой результат, not выдает исключение.

Чтобы сделать PDO более шумным, добавьте PDO::ERRMODE_EXCEPTION опция при создании PDO:

$db = new PDO("mysql:host=$host;port=$port;dbname=$database", $username, $password, 
              array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION)
);

Теперь проверьте, видите ли вы следующее:

Error!: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'workslist.main' doesn't exist
2 голосов
/ 03 декабря 2011

Особая проблема заключается в том, что в строке DSN недопустимы пробелы. С пробелами директива dbname не обрабатывается, поэтому нет базы данных по умолчанию. Помимо удаления пробелов, явное указание базы данных в операторе может помочь предотвратить проблему такого рода:

SELECT `work` FROM `workslist`.`main`

Таким образом, если по какой-либо причине не будет базы данных по умолчанию, запрос все равно будет успешным.

1 голос
/ 26 августа 2016

PDO не выдаст ошибку, если вы не настроите его на:

$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...