Коли я намагаюся використовувати функцію getAttribute, яку я отримуюця помилка: виклик функції члена getAttribute () на не-об'єкт. Здається, що mysqlnd увімкнено, але я не можу використати get_result () будь-яку ідею?
Це мене насправді турбує останнім часом. На інший пост @inspire відповів правильно, але це не працює для мене. Ви можете знайти це тут: Як дізнатися, чи активний драйвер MySQLnd?
Коли я повторюю це:
<?php
$mysqlnd = function_exists("mysqli_fetch_all");
if ($mysqlnd) {
echo "mysqlnd enabled!";
}
нічого не відбувається взагалі, так що, мабуть, це не ввімкнено, навіть якщо мій phpinfo () каже, що це ввімкнено?
Щоб визначити, чи є його активним драйвером PDO, створіть свій об'єкт PDO MySQL:
if (strpos($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), "mysqlnd") !== false) {
echo "PDO MySQLnd enabled!";
}
Коли я спробую це, я отримую виклик до функції члена getAttribute () на об'єкт, який не працює ..
Будь-яка допомога буде дуже вдячна. Заздалегідь спасибі.
Відповіді:
1 для відповіді № 1Перевірка на mysqli_fetch_all
насправді не описує мокріші, якими ви користуєтесь mysqlnd
. Швидше, це говорить про те, що у вас є розширення mysqli включений
MySQLi - це просто оновлена версія mysql
розширення, яке було передбачено в більш ранніх версіях PHP.
The
mysql
розширення,mysqli
розширення таPDO MySQL driver
кожен з них може бути індивідуально налаштований для використання будь-якого libmysqlclient або mysqlnd
Цей код:
<?php
$mysqlnd = function_exists("mysqli_fetch_all");
if ($mysqlnd) {
echo "mysqlnd enabled!";
}
не повторення нічого не говорить про те, що ви не будете компілювати / вмикати / встановлювати MySQL за допомогою MySQLnd. Інші клієнти всередині PHP, такі як старіший mysql або драйвер PDO MySQL, можливо, все ще використовують mysqld.
Кращий спосіб перевірити наявність mysqli з mysqlnd vs mysql з libmysqlclient це зробити:
<?php
$hasMySQL = false;
$hasMySQLi = false;
$withMySQLnd = false;
if (function_exists("mysql_connect")) {
$hasMySQL = true;
$sentence.= "(Deprecated) MySQL <b>is installed</b> ";
} else
$sentence.= "(Deprecated) MySQL <b>is not</b> installed ";
if (function_exists("mysqli_connect")) {
$hasMySQLi = true;
$sentence.= "and the new (improved) MySQL <b>is installed</b>. ";
} else
$sentence.= "and the new (improved) MySQL <b>is not installed</b>. ";
if (function_exists("mysqli_fetch_all")) {
$withMySQLnd = true;
$sentence.= "This server is using MySQLnd as the driver.";
} else
$sentence.= "This server is using libmysqlclient as the driver.";
echo $sentence;
Це працює тому, що mysqlnd надає три додаткові функції, які працюють лише тоді, коли mysqlnd використовується як драйвер. mysqli_fetch_all
є однією з цих функцій, проте найкраще не лише перевірити функцію, яка показує лише, чи був mysqli компільований з mysqlnd, але і функцію, яка показує, чи міститься mysqli взагалі.
Це дозволить представити клієнту кращі повідомлення про помилки.
Нарешті, перевірка PDO повинна мати $pdo
змінна, визначена першою.
$db = new PDO("mysql:host=localhost;dbname=<SOMEDB>", "<USERNAME>", "PASSWORD");
if (strpos($pdo->getAttribute(PDO::ATTR_CLIENT_VERSION), "mysqlnd") !== false) {
echo "PDO MySQLnd enabled!";
}
0 для відповіді № 2
Немає сенсу перевіряти сам драйвер mysqlnd ні в phpinfo, ні в коді.
Немає сенсу перевіряти й інші API. Ви повинні перевірити за бажанням API заснований на mysqlnd, а не інший. Отже, перевіряти mysqli, якщо вам потрібен PDO, немає сенсу.
Щоб перевірити PDO, спочатку потрібно мати об’єкт PDO, як свідчить повідомлення про помилку.