Mysqli bind_param дает ошибку: (1210) Неправильные аргументы mysql_stmt_execute
У меня этот точный код отлично работает на другом сервере:
$mysqli_Cxn = new mysqli($SQL_HOST,$SQL_USER,$SQL_PASS,$SQL_DB);
if($mysqli_Cxn->connect_errno){
echo 'Unable to connect!!';
exit();
}
$userID=12345;
$userFirstName = 'Charley';
$userLocale = 'en_US';
$sql = "UPDATE userProfile SET userFirstName=?, userLocale=? WHERE id=?";
if($stmt = $mysqli_Cxn->prepare($sql)){
if(!$stmt->bind_param('ssi',$userFirstName,$userLocale,$userID)){
echo "<br/><br/>Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
if($stmt->execute()){
totalAffected=$stmt->affected_rows;
if($totalAffected>=1){
echo '<br/><br/>UPDATE OK: Affected rows = '. $totalAffected;
}
}else{
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
}
$stmt->close();
Этот код дает мне следующий результат:
Выполнение не выполнено: (1210) Неверные аргументы mysql_stmt_execute
Если я изменил эти две строки:
$sql = "UPDATE userProfile SET userFirstName=?, userLocale=? WHERE id=?";
$stmt->bind_param('ssi',$userFirstName,$userLocale,$userID);
:
$sql = "UPDATE userProfile SET userFirstName=?, userLocale='en_US' WHERE id=12345";
$stmt->bind_param('s',$userFirstName);
... то обновление успешно, и я не получаю никаких ошибок.
Кто-нибудь знает, почему я не могу связать более одного параметра в этом коде?
У меня был этот код, отлично работающий на Centos 4.9, PHP 5.3.3, MySQL 5.0.91/5.0.91-community-log
Мне нужно запустить его на моем текущем сервере, который является Centos 6.2, PHP 5.3.10, MySQL 5.0.95-community-log
Ответы
Ответ 1
Я провел небольшое исследование, и, похоже, сообщалось об ошибке в источнике MySQL в сочетании с вашей версией GCC и используемыми вами флагами оптимизации.
Если вы не можете изменить версию MySQL, попробуйте перекомпилировать MySQL с добавлением -fno-strict-aliasing к вашим CFLAGS.
Подробнее см. http://bugs.mysql.com/bug.php?id=48284
Ответ 2
Заключительные замечания по этому вопросу.
Я получил новый сервер и выполнил следующую конфигурацию:
PHP 5.3.10
MySQL 5.1.61-cll
Я разрешаю новому серверу принимать внешние подключения и проверять один и тот же код на первом сервере (на этот раз заменяя "localhost" для моего нового IP-сервера).
Это дало мне ту же самую ошибку, когда я попытался использовать в запросе более одного параметра.
Наконец, я протестировал код (с множественным запросом paramater) на новом сервере, и он работал без каких-либо проблем.
Моя логика может быть выключена, но я думаю, проблема связана с клиентской версией mysqli:
первый сервер:
printf("Client library version: %d\n", mysqli_get_client_version());
//Output:
//Client library version: 50095
новый сервер:
printf("Client library version: %d\n", mysqli_get_client_version());
//Output:
//Client library version: 50161
Поэтому я могу сделать две рекомендации:
- Сделайте себе одолжение и перейдите к PDO
- Хотите/Должны придерживаться только mysqli? Убедитесь, что клиентская версия сервера mysqli не 50095
Спасибо всем комментариям/помощи!
PS: Я использую серверы VPS с CPanel. Я попытался перекомпилировать клиента mysqli, используя EasyApache в WHM на первом сервере, и, будучи полным noob во всем этом, я полагаю, что я застрял с версией, предоставляемой через Cpanel (до моего следующего обновления).
Ответ 3
Я предлагаю вам, чтобы явным образом отбрасывал $userID
в integer и повторил, если он все еще не работает.
Поскольку переменные PHP являются вариантами по умолчанию, возможно, вы столкнулись с проблемами при привязке к запросу не string (целое в этом случае).
Можете ли вы попробовать:
$sql = "UPDATE userProfile SET userFirstName=?, userLocale=? WHERE id=?";
$stmt->bind_param('ssi',$userFirstName,$userLocale,(int)$userID);
Ответ 4
Я столкнулся с той же проблемой.
(Параметры привязки не принимают более одного параметра)
Моя версия mysql с помощью этой команды:
printf ("Client library Version:% d \ n", mysqli_get_client_version ());
: 50094
Проблема 50095 затрагивает эту проблему:
https://www.liketly.com/forum/thread/27005/mysqli-bind_param-giving-error-1210-incorrect-arguments-to-mysql_stmt_execute/
После обновления PHP с 5.4 до 5.6 (на общем сервере) также была обновлена версия mysql, и проблема исчезла.
Моя новая версия mysql - 50011