알고 있습니다.SQLSTATE [HY093] : 잘못된 매개 변수 번호 : 매개 변수가 정의되지 않았습니다 (PDO)
그러나 믿어주세요, 저는이 문제를 해결하는 방법에 대해 꽤 오랫동안 연구 해 왔습니다. 달성하고자하는 것은 PDO와 함께 사용하기위한 PDO MySQL 데이터베이스 래퍼로서 필자의 코드에 통합 할 수 있습니다. 내 주요 문제는 특히 두 개의 함수뿐만 아니라 도달하려고하는 매개 변수의 실제 바인딩에서 유래합니다. 내가 왜 두 개의 기능을 반대하는 이유는 내 노력에도 불구하고 어느 것이 문제를 일으키는 지 파악할 수 없었기 때문입니다. 변수의 나는 var_dump
에드가 변수가 아니라는 것을 확인했습니다. 그것은 다른 것입니다. 여전히, 내가 처음에이 오류가 발생한다는 사실은 무언가가 코드에 잘못되었음을 의미합니다.
별첨 A :fetch($table, $columns, $whereArgs)
이 함수의 목적은 단순히 열을 인출하기위한 것이다. 이것은 작업을 구체적으로 수행하기 위해 필요한 열과 where-clause와 함께 가져올 행의 테이블을 수락하면 수행됩니다. 매개 변수가 제출되면 동적으로 쿼리를 구성하는 하나 또는 두 개의 루프가 호출됩니다.
public function fetch($table, $columns, $whereArgs)
{
if ($whereArgs === NULL && $columns === NULL) return false;
$select = "SELECT ";
$where = " WHERE ";
$iQuery = 0;
$sqlParams = array();
$columnCount = count($columns) - 1;
foreach($whereArgs as $key => $value)
{
$paramKey = sprintf(':%s', $key);
$where .= sprintf("`%s`= %s", $key, $paramKey);
$sqlParams[ "{$paramKey}" ] = sprintf("%s", $value);
if ($iQuery <= $columnCount)
{
$select .= sprintf('`%s`', $columns[ $iQuery ]);
$select .= ', ';
}
else
{
$select .= ' ';
}
++$iQuery;
}
if ($iQuery <= $columnCount)
{
for(; $iQuery < $columnCount; ++$iQuery)
{
if ($iQuery < $columnCount)
{
$select .= sprintf('`%s`', $columns[ $iQuery ]);
$select .= ', ';
}
else
{
$select .= ' ';
}
}
}
$select .= sprintf("FROM `%s`", $table);
$query = $select . $where;
return $this->doQuery($query, $sqlParams, TRUE, QueryType::Row);
}
별첨 B :doQuery($query, $sqlParams, $return = FALSE, $queryType = QueryType::None)
이 함수는 비교적 간단하다 어느있다 (리턴 타입을 반환하는 타입의 신속하게 확인하면서 수행 모두가 결합 값이며, 문을 실행할 '행', '열'또는 '모두'는이 문제의 범위를 벗어나는 클래스 QueryType
클래스에 의해 지정된 다음 요청 된 것을 반환합니다.
protected function doQuery($query, $sqlParams, $return = FALSE, $queryType = QueryType::None)
{
$statement = $this->mConnection->prepare($query);
foreach($sqlParams as $param => $value)
{
$statement->bindValue($param, $value);
}
$statement->execute();
if ($return)
{
switch($queryType)
{
case QueryType::Row:
return $statement->fetch();
case QueryType::Column:
return $statement->fetchColumn();
case QueryType::All:
return $statement->fetchAll();
case QueryType::None:
return $statement;
default:
return false;
}
}
}
전시 C :test.php
이 단순히 내가 데이터베이스를 테스트하기 위해 쓴 작은 테스트 스크립트입니다.
$database = new Database('evolve_admin');
$res = $database->fetch(
'evol_users',
array('user.id', 'user.email', 'user.firstname'),
array('user.email' => '[email protected]')
);
var_dump($res);
기타 의견
내가 내 코드 문제 뭔가가 있다는 것을 배웠다는, 난 그냥 정확히이 될 수 무엇으로 잃었어요. 지금까지 디버깅 기술이 끝나면 에이이 문제를 상당히 연구했으며이 오류는 매우 흔한 것 같습니다. 내 주요 목표는이 래퍼가 작동하도록하는 것입니다. 누군가 코드 자체 (특히이 문제의 범위를 벗어나는 것들 포함)에 결함이 있으면 알려주십시오.
이 핸드를 제공하는 사람에게 : 감사합니다.
바인딩 된 매개 변수의 수에 대해 생성 된 SQL을 확인한 다음 그 수가 일치하지 않는 이유를 찾아냅니다. – Corbin
문제는 바인딩되는 단일 매개 변수 만 있다는 것입니다. 필자는 for 루프를 테스트하고 매개 변수를 바인딩합니다. 나는 변수들을 출력 할 수 있는데, 그들은 그들이보아야하는 것처럼 정확하게 보인다. – zeboidlund
아니요, 문제는 매개 변수가 바인딩되지 않습니다 (또는 더 구체적으로 N 매개 변수가 있고 x
Corbin