Как следует из названия, у меня есть mysqlnd, доступный на моем общем хостинговом сервере с PHP версии 5.4. Когда я пытаюсь вызвать функцию mysqli get_result (), я получаю эту ошибку.
Я несколько раз говорил с хостинг-провайдером, и совсем недавно они сказали мне попробовать запустить
# /opt/ntphp/php54/bin/php -i | grep -i mysqlnd
Я прыгнул на ssh и выполнил эту команду, которая дала это:
mysqlnd mysqlnd => enabled Version => mysqlnd 5.0.10 - 20111026 - $Id: c85105d7c6f7d70d609bb4c000257868a40840ab $ Loaded plugins => mysqlnd,example,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password mysqlnd statistics => Client API version => mysqlnd 5.0.10 - 20111026 - $Id: c85105d7c6f7d70d609bb4c000257868a40840ab $
Итак, это кажется мне так, как я ожидал.
Я нашел еще один фрагмент кода PHP на другом форуме, который предлагает запустить:
$hasMySQL = false; $hasMySQLi = false; $withMySQLnd = false; $sentence = ''; 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_get_client_stats')) { $withMySQLnd = true; $sentence.= "This server is using MySQLnd as the driver."; } else $sentence.= "This server is using libmysqlclient as the driver."; echo $sentence;
Я сделал это и получил результат:
(Устаревший) MySQL установлен и установлен новый (улучшенный) MySQL. Этот сервер использует libmysqlclient в качестве драйвера.
Я запускаю мой хостинг с Arvixe, и у них было сообщение в блоге, в котором в основном говорилось: «Запустите PHP 5.4, и это будет работать». Мне ясно, что они думают, что эта функция должна работать, но вместо этого она приводит к фатальной ошибке.
Боковое примечание – код отлично работает на моей локальной машине, и я получаю сообщение об ошибке с вызовом get_result ().
Редакция:
Вот как настроен PHP:
$stmt = $con->prepare("SELECT * FROM User_Details WHERE LCASE(username) = LCASE(?) LIMIT 1"); $stmt->bind_param("s", $username); $stmt->execute(); $result = $stmt->get_result(); // This line throws the ugly error
Для кого-то интересно, что с этим происходит, и с помощью Arvixe. Вот ответ, который я получил от персонала.
Это некоторая путаница вокруг MySQLND, которая была вызвана старой платформой и ее сообщением с моим персоналом.
Мы использовали для запуска систему, которая позволяла нам иметь индивидуальные установки PHP, и в этот момент в 5.4 и 5.5 оба были запущены MysqlND. Новая система PHP, в которой мы работаем, запускает все установки PHP в согласованной конфигурации и поэтому с нашей установкой PHP 5.3 (базовая установка), не использующей MySQLND, и не устанавливает нашу версию 5.4 или 5.5.
Это будет рассмотрено в будущем, поскольку PHP 5.6 будет иметь MySQLND по умолчанию.
В настоящее время единственным способом поддержки MySQLND является использование VPS / выделенного сервера.
Итак, если вы находитесь на Arvixe, а не на VPS, вам не повезло, если вы используете супер общее и рекомендуемое соглашение для извлечения данных из вашей базы данных. Для этого используются обходные пути с использованием тонны различных методов. Они либо невозможны для моего проекта, либо я не мог заставить их работать, но для небольших запросов кажется, что использование $ stmt-> bind_result () является одним из наиболее популярных методов. http://php.net/manual/en/mysqli-stmt.bind-result.php
Для меня я возвращаю свой бизнес в GoDaddy. Я потратил более 10 часов, пытаясь найти решение для этого без разрешения, кроме «У нас есть 60-дневная гарантия возврата денег, если вы не удовлетворены».
Спасибо всем за помощь в этом. Разочарование, как и было, я многому научился в этом процессе и с этих плат … Как это обычно бывает.
Когда вы запускали код, который проверял среду PHP, это было через веб-сервер? Я спрашиваю об этом, потому что похоже, что вы не настроили ваш веб-сервер на использование PHP 5.4 (у которого, предположительно, есть версия mysqli, которую вы используете).
Вы можете обратиться к этой статье из Arvixe.
Интересно, что функция, вызывающая проблемы, появляется с PHP 5.3.
Вы также можете попробовать простой скрипт для просмотра среды из Интернета
<?php phpinfo();
Ударьте это из Интернета и проверьте пару вещей
Лично я не уверен, что mysqlnd требуется для предоставления функции get_results
(но для этого нужно копать глубже).
Еще один тест, который вы можете сделать, чтобы убедиться, что на самом деле среда PHP 5.4 для Arvixe представляет собой интересную функцию тестирования среды CLI, которую вы знаете, имеет mysqlnd
/opt/ntphp/php54/bin/php -r 'echo method_exists("mysqli_stmt", "get_result") . PHP_EOL;'
Если это выплеснет 1
, вам почти наверняка нужно будет следовать этому руководству, с которым я связался раньше, чтобы ваша среда веб-сервера работала с PHP 5.4.
Удалите существующую версию php и установите новую версию php 5.5 или более поздней версии и проверьте, выполнив ее на корневом терминале $ php -v