Подтвердить что ты не робот

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

4b9b3361

Ответ 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