簡體   English   中英

SQLSTATE[HY093]:參數號無效:參數未定義

[英]SQLSTATE[HY093]: Invalid parameter number: parameter was not defined

// 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]:參數號無效:參數未定義

是因為$values & $matches中的元素數量不同或$matches包含超過 1 個元素。

如果$matches包含超過 1 個元素,則插入將失敗,因為查詢中僅引用了 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 ;

代碼在我的 XAMPP 服務器上運行,該服務器使用 PHP 5.3.8 和 MySQL 5.5.16。

SQLSTATE[HY093]:參數號無效:參數未定義

不幸的是,此錯誤不能描述與同一問題相關的一系列不同問題 - 綁定錯誤。 它也沒有指定錯誤在哪里,因此您的問題不一定在執行中,而是已經“准備好”的 sql 語句。

這些是可能的錯誤及其解決方案:

  1. 存在參數不匹配 - 字段數與已綁定的參數不匹配。 注意數組中的數組。 仔細檢查 - 使用var_dump($var) print_r ”不一定會顯示數組中的索引是否是另一個數組(如果數組中有一個值),而var_dump會。

  2. 您嘗試使用相同的綁定值進行綁定,例如:“:hash”和“:hash”。 每個索引都必須是唯一的,即使在邏輯上對兩個不同的部分使用相同的索引是有意義的,即使它是相同的值。 (它類似於一個常量,但更像一個占位符)

  3. 如果您在一個語句中綁定了多個值(通常是使用“INSERT”的情況),您需要先綁定參數,然后再綁定值到參數。 這里的過程是將參數綁定到字段,然后將值綁定到參數。

     // 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. '' 單引號中的任何值始終被視為字符串,不會被讀取為要綁定的列/表名稱或占位符。

綁定時使用錯誤的參數名稱后,我遇到了同樣的錯誤。

注意:tokenHash在查詢的VALUES子句中,但:token_hash在綁定時。

修復一個或另一個解決了錯誤。

// 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);

如果您在 PHP 中的列名與數據庫列名不匹配,我發現的相同錯誤將顯示,請仔細檢查。 這就是我錯了。

我知道答案很有用但是由於某種原因它對我不起作用但是我已經使用以下代碼改變了情況並且它是完美的

    <?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 {

}

?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM