12

私はこれとまったく同じコードを別のサーバーでうまく機能させています:

$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();

このコードにより、次の出力が得られます。

これらの2行を変更すると:

$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 である現在のサーバーで実行する必要があります。

4

4 に答える 4

1

この問題に関する最終的な注意事項。

次の構成で新しいサーバーを稼働させました。

PHP 5.3.10
MySQL 5.1.61-cll

新しいサーバーが外部接続を受け入れられるようにし、最初のサーバーで同じコードをテストしました (今回は、新しいサーバーの IP を "localhost" に置き換えました)。

クエリで複数のパラメーターを使用しようとすると、まったく同じエラーが発生しました。

最後に、新しいサーバーでコードを (複数のパラメーター クエリを使用して) テストしたところ、問題なく動作しました。

私の論理はかなり外れているかもしれませんが、問題は 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 

したがって、次の 2 つの推奨事項を提示できます。

  1. PDOに行きましょう
  2. mysqli のみに固執したい/しなければなりませんか? サーバーの mysqli クライアントのバージョンが50095でないことを確認してください

みんなのコメント/ヘルプに感謝します!

PS: CPanel で VPS サーバーを使用しています。最初のサーバーで WHM の EasyApache を使用して mysqli クライアントを再コンパイルしようとしましたが、これはまったく初心者でした。Cpanel を介して提供されたバージョンに固執していると思います (次のアップグレードまで)。

于 2012-04-21T05:39:29.967 に答える
0

明示的に整数にキャスト$userIDし、それでも失敗する場合は再テストすることをお勧めします。

PHP変数はデフォルトでバリアントであるため、非文字列(この場合は整数)をクエリにバインドするときに問題が発生する可能性があります。

試してみてください:

$sql = "UPDATE userProfile SET userFirstName=?, userLocale=? WHERE id=?";
$stmt->bind_param('ssi',$userFirstName,$userLocale,(int)$userID);
于 2012-04-10T06:43:12.863 に答える
0

まったく同じ問題に遭遇しました。

(バインド パラメーターは複数のパラメーターを受け入れませんでした)

このコマンドを使用する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です

于 2015-12-19T23:56:23.987 に答える