/ / phpinfo каже, що MySQLnd є активним драйвером або я розгублений - php, mysql, pdo, phpinfo, mysqlnd

phpinfo каже, що MySQLnd є активним драйвером або я плутаю - php, mysql, pdo, phpinfo, mysqlnd

Коли я намагаюся використовувати функцію 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, як свідчить повідомлення про помилку.