41
// BUILD VALUES
$count = count($matches);
for($i = 0; $i < $count; ++$i) {
    $values[] = '(?)';
}
// INSERT INTO DATABASE
$q = $this->dbc->prepare("INSERT INTO hashes (hash) VALUES " . implode(', ', $values) . " ON DUPLICATE KEY UPDATE hash = hash");
$q->execute($matches);

上記のコードは次のエラーで失敗します

SQLSTATE [HY093]:無効なパラメーター番号:パラメーターが定義されていません

count($matches) == count($values)実行直前が呼び出されるのはいつですか?

ここで何が起こっているのですか?

4

5 に答える 5

53

発生しているこのエラー:

SQLSTATE [HY093]:無効なパラメーター番号:パラメーターが定義されていません

$values&の要素数が$matches同じでないか、複数の要素$matchesが含まれているためです。

複数の要素が含まれている場合、query( )$matchesで参照される列名は1つしかないため、挿入は失敗します。hash

$values&に同じ数の要素が含まれていない場合$matches、クエリはxパラメータを予期しているが、yデータを受信して​​いるため、挿入も失敗します$matches

また、列ハッシュにも一意のインデックスがあることを確認する必要があると思います。

ここでコードを試してください:

<?php

/*** mysql hostname ***/
$hostname = 'localhost';

/*** mysql username ***/
$username = 'root';

/*** mysql password ***/
$password = '';

try {
    $dbh = new PDO("mysql:host=$hostname;dbname=test", $username, $password);
    /*** echo a message saying we have connected ***/
    echo 'Connected to database';
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }

  
$matches = array('1');
$count = count($matches);
for($i = 0; $i < $count; ++$i) {
    $values[] = '?';
}

// INSERT INTO DATABASE
$sql = "INSERT INTO hashes (hash) VALUES (" . implode(', ', $values) . ") ON DUPLICATE KEY UPDATE hash='hash'";
$stmt = $dbh->prepare($sql);
$data = $stmt->execute($matches);

//Error reporting if something went wrong...
var_dump($dbh->errorInfo());

?>

あなたはそれを少し適応させる必要があるでしょう。

私が使用したテーブル構造はここにあります:

CREATE TABLE IF NOT EXISTS `hashes` (
  `hashid` int(11) NOT NULL AUTO_INCREMENT,
  `hash` varchar(250) NOT NULL,
  PRIMARY KEY (`hashid`),
  UNIQUE KEY `hash1` (`hash`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

コードは、MySQL5.5.16でPHP5.3.8を使用しているXAMPPサーバーで実行されました。

于 2012-06-10T10:03:58.703 に答える
8

SQLSTATE [HY093]:無効なパラメーター番号:パラメーターが定義されていません

残念ながら、このエラーは、同じ問題に関連するさまざまな問題(バインディングエラー)を説明するものではありません。また、エラーの場所も指定されていないため、問題は必ずしも実行にあるとは限りませんが、すでに「準備されている」SQLステートメントにあります。

考えられるエラーとその解決策は次のとおりです。

  1. パラメータの不一致があります-フィールドの数がバインドされているパラメータと一致しません。配列内の配列に注意してください。再確認するには-var_dump($ var)を使用します。「print_r」は、配列内のインデックスが別の配列であるかどうか(配列に1つの値がある場合)を必ずしも表示しませんが、var_dumpは表示します。

  2. 同じバインド値を使用してバインドしようとしました(例: ":hash"と ":hash")。論理的には、同じ値であっても、2つの異なる部分に同じものを使用することが理にかなっている場合でも、すべてのインデックスは一意である必要があります。(定数に似ていますが、プレースホルダーに似ています)

  3. ステートメント内に複数の値をバインドする場合(「INSERT」の場合によくあることですが)、bindParamを実行してから、bindValueをパラメーターにバインドする必要があります。ここでのプロセスは、パラメーターをフィールドにバインドしてから、値をパラメーターにバインドすることです。

    // Code snippet
    $column_names = array();
    $stmt->bindParam(':'.$i, $column_names[$i], $param_type);
    $stmt->bindValue(':'.$i, $values[$i], $param_type);
    $i++;
    //.....
    
  4. 値をcolumn_namesまたはtable_namesにバインドする場合、 ``を使用できますが、必須ではありませんが、一貫性があることを確認してください。

  5. ''一重引用符で囲まれた値は常に文字列として扱われ、バインドする列/テーブル名またはプレースホルダーとして読み取られることはありません。

于 2018-02-12T17:05:38.933 に答える
3

バインド時に間違ったパラメータ名を使用した後、同じエラーが発生しました。

クエリの句に:tokenHashがありますが、バインドするときは token_hashに注意してください。VALUES

どちらかを修正すると、エラーが解決しました。

// Prepare DB connection
$sql = 'INSERT INTO rememberedlogins (token_hash,user_id,expires_at)
        VALUES (:tokenHash,:user_id,:expires_at)';
$db = static::getDB();
$stmt = $db->prepare($sql);

// Bind values
$stmt->bindValue(':token_hash',$hashed_token,PDO::PARAM_STR);
于 2020-06-07T00:53:19.670 に答える
0

私が見つけたのと同じエラーは、PHPの列名とデータベースの列名が一致しない場合に表示されます。それも再確認してください。これは私が間違っていたものです。

于 2021-11-16T19:50:13.900 に答える
-2

答えは役に立ったと理解していますが、何らかの理由でうまくいきませんが、次のコードで状況を移動しました。これは完璧です。

    <?php

$codigoarticulo = $_POST['codigoarticulo'];
$nombrearticulo = $_POST['nombrearticulo'];
$seccion        = $_POST['seccion'];
$precio         = $_POST['precio'];
$fecha          = $_POST['fecha'];
$importado      = $_POST['importado'];
$paisdeorigen   = $_POST['paisdeorigen'];
try {

  $server = 'mysql: host=localhost; dbname=usuarios';
  $user   = 'root';
  $pass   = '';
  $base   = new PDO($server, $user, $pass);

  $base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $base->query("SET character_set_results = 'utf8',
                     character_set_client = 'utf8',
                     character_set_connection = 'utf8',
                     character_set_database = 'utf8',
                     character_set_server = 'utf8'");

  $base->exec("SET character_set_results = 'utf8',
                     character_set_client = 'utf8',
                     character_set_connection = 'utf8',
                     character_set_database = 'utf8',
                     character_set_server = 'utf8'");

  $sql = "
  INSERT INTO productos
  (CÓDIGOARTÍCULO, NOMBREARTÍCULO, SECCIÓN, PRECIO, FECHA, IMPORTADO, PAÍSDEORIGEN)
  VALUES
  (:c_art, :n_art, :sec, :pre, :fecha_art, :import, :p_orig)";
// SE ejecuta la consulta ben prepare
  $result = $base->prepare($sql);
//  se pasan por parametros aqui
  $result->bindParam(':c_art', $codigoarticulo);
  $result->bindParam(':n_art', $nombrearticulo);
  $result->bindParam(':sec', $seccion);
  $result->bindParam(':pre', $precio);
  $result->bindParam(':fecha_art', $fecha);
  $result->bindParam(':import', $importado);
  $result->bindParam(':p_orig', $paisdeorigen);
  $result->execute();
  echo 'Articulo agregado';
} catch (Exception $e) {

  echo 'Error';
  echo $e->getMessage();
} finally {

}

?>
于 2019-12-14T22:44:41.117 に答える