4

$fields は、印刷後に次のような値を取得する配列です。

Array ( [first_name] => Nisse [last_name] => Example [ssn] => 198306205053 [address] =>           Stockholm, Sverige [phone_number] => 54654987321546 [latitude] => 55.717089999999999 [longitude] => 13.235379 )

次のように、データクラスから update 関数を呼び出します。

DataManager::update_user($fields, $user_data['id'];

しかし、私はエラーが発生します:

警告: PDOStatement::execute(): SQLSTATE[HY093]: 無効なパラメーター番号: パラメーターが定義されていません...filetext

他の同様のスレッドをいくつか確認しましたが、まだ答えが見つからないため、基本的な概念が欠けていると思います。私が見る限り、配列には 7 つの ? と 7 つの項目があり、すべての値を定義すると、SQL ワークベンチで完全に実行できます。

UPDATE users SET first_name = 'Kalle', last_name = 'Anka', ssn = 242345234, address = 'Stockholm', phone_number = 53423434, latitude = 17.189889231223423423424324234, longitude = 109.234234 WHERE id = 4

$user_id を特定の値に設定し、緯度/経度パラメーターを指定せずに、PDO 準備済みステートメントを試しました。

重要な情報を忘れた場合は、それを指摘してください。アドレスは varchar で、lat/long は DB の float です。MYSQL の使用。

以下の機能:

public static function update_user($fields, $user_id)
{
    $db = self::_connect();

    $st = $db->prepare("UPDATE users SET first_name = ?, last_name = ?, ssn = ?, address = ?, phone_number = ?, latitude = ?, longitude = ? WHERE id = '{$user_id}'");
    $st->execute($fields);

    return ($st->rowCount()) ? true : false;
}
4

1 に答える 1

6

位置パラメータを使用する場合、渡すパラメータの配列はexecute()序数配列である必要があります。同様に、名前付きパラメーターを使用する場合、配列は連想配列である必要があります。

動作を確認するためのテストは次のとおりです。

$stmt = $db->prepare("SELECT ?, ? ,?");

$params = array( 'a', 'b', 'c' );
// OK
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

$params = array( 'A'=>'abc', 'B'=>'def', 'C'=>'ghi' );
// ERROR!
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

$stmt = $db->prepare("SELECT :A, :B, :C");

$params = array( 'a', 'b', 'c' );
// ERROR!
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

$params = array( 'A'=>'abc', 'B'=>'def', 'C'=>'ghi' );
// OK
if ($stmt->execute($params)) {
  print_r($stmt->fetchAll());
}

PHPの現在のバージョンでは、連想配列キーの前に@prodigitalsonコメントを付ける必要がないことに注意してください。:以前の:バージョンのPHPでは、配列キーにプレフィックスが必要でした。

また、単一のクエリで位置パラメータと名前付きパラメータを混在させようとしたときに、バグや予測できない動作が発生したことにも言及する価値があります。アプリのさまざまなクエリでどちらのスタイルも使用できますが、特定のクエリに対していずれかのスタイルを選択します。

于 2013-02-11T18:58:45.593 に答える