У меня этот точный код отлично работает на другом сервере:
$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();
Этот код дает мне следующий результат: Execute failed: (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
Я провел небольшое исследование, и похоже, что в источнике MySQL появилась ошибка в сочетании с вашей версией GCC и используемыми вами флагами оптимизации. Если вы не можете изменить версию MySQL, попробуйте перекомпилировать MySQL с добавлением -fno-strict-aliasing к вашему CFLAGS.
См. http://bugs.mysql.com/bug.php?id=48284 для получения более подробной информации.
Заключительные замечания по этому вопросу.
Я получил новый сервер и выполнил следующую конфигурацию:
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
Поэтому я могу сделать две рекомендации:
Спасибо всем комментариям / помощи!
PS: Я использую серверы VPS с CPanel. Я попытался перекомпилировать клиента mysqli, используя EasyApache в WHM на первом сервере, и, будучи полным noob, – я предполагаю, что я застрял с версией, предоставляемой через Cpanel (до моего следующего обновления).
Я хотел бы предложить вам, чтобы явным образом $userID
целому числу и повторно тестировал, если он все еще терпит неудачу.
Поскольку переменные PHP являются вариантами по умолчанию, возможно, у вас возникают проблемы при привязке к запросу не string (целое в этом случае).
Ты можешь попробовать:
$sql = "UPDATE userProfile SET userFirstName=?, userLocale=? WHERE id=?"; $stmt->bind_param('ssi',$userFirstName,$userLocale,(int)$userID);
Я столкнулся с той же проблемой.
(Параметры привязки не принимали более одного параметра)
Моя версия mysql с помощью этой команды:
printf ("Client library Version:% d \ n", mysqli_get_client_version ());
было: 50094
Версия 50095 касается этой проблемы:
После обновления с PHP 5.4 до 5.6 (на общем сервере) была обновлена также версия mysql, и проблема исчезла.
Моя новая версия mysql – 50011