2012-06-10 2 views
20
// 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] : 유효 파라미터 번호 : 파라메터가 정의되지 않은

SQLSTATE [HY093] 실패

잘못된 파라미터 번호 : 매개 변수가 정의되지

비록 실행 직전에 count($matches) == count($values)이 호출 되었더라도?

여기에 무슨 일이 일어나고 있습니까?

+4

대신 array_values ​​($ matches)를 전달해 보셨습니까? –

+0

왜 '중복 키 업데이트 해시 = 해시'입니까? 'INSERT IGNORE ...'도 할 수 있습니다. 'UPDATE hash = VALUES (hash)'를하고 싶습니까? – eggyal

+0

'$ values' 배열에 이미 루프 이전에 무언가가 들어 있었습니까? 또한, 하나의 INSERT INTO 해시 (해시) VALUES (?)를 준비하고 여러 번 실행하는 것이 어떻습니까? – eggyal

답변

36

이 오류 받고있는 :

SQLSTATE [HY093] : 잘못된 매개 변수 번호 : $values & $matches의 요소 수는 없기 때문에 매개 변수가

정의되지 않은입니다 동일하거나 $matches에 1 개 이상의 요소가 포함되어 있습니다.

$matches 쿼리에서 참조 단 1 열 이름이 있기 때문에 삽입이 실패합니다보다 1 개 이상의 요소가 포함되어있는 경우 $values & $matches 다음 같은 수의 요소를 포함하지 않는 (hash)

경우 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()); 

?> 

:

코드 here를 사용해보십시오. 내가 사용

테이블 구조는 here입니다 :

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 ; 

코드의 MySQL 5.5.16과 PHP 5.3.8을 사용하는 내 XAMPP 서버에서 실행되었습니다.

이 정보가 도움이되기를 바랍니다.

+0

고마워이게 해결 됐어! – Griff

+0

걱정할 필요가 없습니다. – Haroon

+2

훌륭한 답변입니다. 동일한 식별자를 가진 두 개의 열을 정의했기 때문에 좋은 답변입니다. ': example'도 확인해야합니다! – Darren

1

는 SQLSTATE는 [HY093] : 유효 파라미터 번호 - 결합 오차 파라미터 오류가 동일한 문제와 관련된 다른 문제의 범위에 대한 설명이 없다 불행히도

정의되지 않았다. 또한 오류가있는 위치를 지정하지 않으므로 문제가 반드시 실행에있는 것이 아니라 이미 '준비된'SQL 문입니다.

은 가능한 오류 및 해결 방법은 다음과 같습니다

  1. 매개 변수 불일치가있다 - 바인딩 된 매개 변수와 일치하지 않는 필드의 수. 배열의 배열을 조심하십시오.다시 확인하려면 var_dump ($ var)을 사용하십시오. "print_r"은 배열의 인덱스가 다른 배열 (배열의 값이 하나 인 경우) 인 반면, 의 var_dump은 반드시 표시됩니다.

  2. 동일한 바인딩 값 (예 : ": hash"및 ": hash")을 사용하여 바인딩하려고했습니다. 논리적으로 두 개의 다른 부분에 대해 동일한 값을 사용하더라도 모든 인덱스는 고유해야합니다. (상수와 비슷하지만 자리 표시 자와 비슷합니다.) 문에서 하나 이상의 값을 바인딩하는 경우 ("INSERT"와 마찬가지로) 바인딩하려면 bindParam과 bindValue를 다음과 같이 사용해야합니다. 매개 변수 여기서 프로세스는 매개 변수를 필드에 바인딩 한 다음 값을 매개 변수에 바인딩하는 것입니다.

    // Code snippet 
    $column_names = array(); 
    $stmt->bindParam(':'.$i, $column_names[$i], $param_type); 
    $stmt->bindValue(':'.$i, $values[$i], $param_type); 
    $i++; 
    //..... 
    
  3. 당신이``하지만 필요하지 사용하지만, 일관성이 있는지 확인 할 수 COLUMN_NAMES 또는 table_names에 값을 바인딩.

  4. ''작은 따옴표의 값은 항상 문자열로 처리되며 바인딩 할 열/테이블 이름 또는 자리 표시 자로 읽히지 않습니다.

+0

이유 # 2를 가져 주셔서 감사합니다. 나는 이것을 여기에서 발견했다. – swa66

관련 문제