PHP эхо и PDO - как устранить ошибку запроса функции-члена? - PullRequest
0 голосов
/ 26 августа 2011

Это продолжение моего предыдущего вопроса на Использование PDO для замены mysql_connect - правильное форматирование?

Это часть большой страницы, которая сама будет отображатьсяна другую страницу

<?php
/*** mysql hostname ***/
$hostname = 'localhost';

/*** mysql username ***/
$username = 'root';

/*** mysql password ***/
$password = 'MYPASSWORD';

try {
    $dbh = new PDO("mysql:host=$hostname;dbname=radiotest", $username, $password);
    /*** echo a message saying we have connected ***/

    /*** The SQL SELECT statement ***/
    $sql = "SELECT * FROM presenters";
    foreach ($dbh->query($sql) as $row)
        {
        }

    /*** close the database connection ***/
    $dbh = null;
}
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>
<?php foreach ($dbh->query($sql) as $row) ?>
<table>
<td>
<tr><?php echo $row['presenter'] ?><?php echo $row['show'] ?>  </tr>
</table>

Это выдало эту ошибку:

Fatal error: Call to a member function query() on a non-object in C:\www\vhosts\localhost\radio1.php on line 29

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

    <?php
/*** mysql hostname ***/
$hostname = 'localhost';

/*** mysql username ***/
$username = 'root';

/*** mysql password ***/
$password = 'MYPASSWORD';

try {
    $dbh = new PDO("mysql:host=$hostname;dbname=radiotest", $username, $password);
    /*** echo a message saying we have connected ***/

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

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

Что может быть причиной этой ошибки и почему?

Что я должен делать с кодом, чтобы убедиться, что он зациклен:

<table>
<td>
<tr><?php echo $row['presenter'] ?><?php echo $row['show'] ?>  </tr>
</table>

В основном я пытаюсь использовать PDO для замены mysql_connect для отображения строк в таблицах или списках определений в HTMLмой сайт тестирования.

Вот отредактированная версия сейчас:

<?php
/*** mysql hostname ***/
$hostname = 'localhost';

/*** mysql username ***/
$username = 'root';

/*** mysql password ***/
$password = 'MYPASSWORD';

try {
    $dbh = new PDO("mysql:host=$hostname;dbname=radiotest", $username, $password);
    /*** echo a message saying we have connected ***/

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

        }

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

<table>
<td>
<tr><?php echo $row['presenter'] ?><?php echo $row['show'] ?> </tr>
</table>

Отображает данные, но не в таблице ниже.

Ответы [ 4 ]

2 голосов
/ 26 августа 2011

Вы устанавливаете $dbh = null;. Так что $dbh больше не доступен в строке 29.

Кроме того, довольно неэффективно то, что вы делаете в первом примере. Вы запрашиваете базу данных дважды. Лучше сохраните результирующий набор в первый раз и используйте его позже, если необходимо.

Возможно, вам нужно что-то вроде следующего:

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

    $sql = "SELECT * FROM presenters";
    $result = $dbh->query( $sql );

    // not really necessary
    $dbh = null;
}
catch(PDOException $e)
{
    echo $e->getMessage();
}
?>

<?php
    // using alternative foreach syntax 
    foreach($result as $row):
?>
<table>
<tr>
<td><?php echo $row['presenter']; ?><?php echo $row['show']; ?>  </td>
</tr>
</table>
<?php
    // using alternative syntax 
    endforeach;
?>
1 голос
/ 26 августа 2011

Вы убиваете свой дескриптор базы данных в нижней части блока try.Вы открываете соединение, запускаете запрос, извлекаете результаты, выбрасываете результаты, затем закрываете соединение.

Таким образом, к тому времени, когда PHP достигает строки 29, $ dbh теперь равен NULL и не может использоватьсяобъект PDO больше.

0 голосов
/ 26 августа 2011

PDO не лучше, чем mysql ext
вам нужен более интеллектуальный слой абстракции.

также, echo не имеет ничего общего с PDO. Вы должны использовать шаблоны и разделить все свои коды на получение части данных и отображение части данных

0 голосов
/ 26 августа 2011

Вы определяете $dbh внутри блока try.Вне не существует вне, но вы пытаетесь использовать его.Избавьтесь от блока try.Если будет сгенерировано исключение, скрипт автоматически остановится.

Кроме того, вы устанавливаете его на null в конце своего замедления.

Кроме того, почему вы пытаетесь получить доступ к dbh вне блока try?Я не вижу цели.

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