쿼리 실패와 같은 SQL- 준비한 명령문의 치명적인 오류
문제
다음 코드가 있습니다.
$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE '% ? %'";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("ss", $table, $brand);
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = mysql_num_rows($data);
$rows = getRowsByArticleSearch($query, $table, $max);
$last = ceil($rowcount/$page_rows);
}
잘 작동합니다. 그러나 나는 다음과 같은 오류를받습니다.
SQL 구문에 오류가 있습니다. 오른쪽 구문이 근처에 사용될 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. 1 행에서 '%?%' '와 같은 상위 (article_name)가있는 곳
내가 넣으면
SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '% o %';
쿼리는 잘 작동합니다. $ 테이블은 위에 정의되어 있으며 쿼리는 get에서 수신되며 둘 다 올바른 유효한 값입니다. 이것이 실패한 이유는 무엇입니까?
편집 : 변경 :
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE '% ? %'";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $query);
오류가 발생합니다.
경고 : mysqli_stmt :: bind_param () [mysqli-stmt.bind-param] : c : program 파일의 준비 문서에서 변수 수가 일치하지 않습니다. easyphp 3.0 www prog get_records.php 38
동기화 된 명령; 지금이 명령을 실행할 수 없습니다
반면
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", "%".$query."%");
결과
치명적인 오류 : c : program files easyphp 3.0 www prog get_records.php 38에서 참조로 매개 변수 2를 전달할 수 없습니다.
그리고 마지막으로
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ? ";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $query);
만 제공 할 것입니다 :
동기화 된 명령; 지금이 명령을 실행할 수 없습니다
같은 통계에 매개 변수를 사용하는 것이 불가능합니까?
해결책
을 위한 LIKE
조항, 이것을 사용하십시오 :
SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ?, '%')
테이블 이름은 테이블 이름을 매개 변수로 갖는 것이 매우 나쁜 연습입니다.
어떤 이유로 든 여전히해야한다면 쿼리를 준비하기 전에 쿼리 텍스트에 포함시켜야합니다.
$countQuery = "SELECT ARTICLE_NO FROM $table_name WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ? ,'%')";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $brand);
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = mysql_num_rows($data);
$rows = getRowsByArticleSearch($query, $table, $max);
$last = ceil($rowcount/$page_rows);
}
다른 팁
발행 했습니까?
mysqli_free_result($result);
마지막 쿼리 후? 이것이 동기화 오류의 명령입니다.
그러나 이것은 작동해야합니다
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", "%".$query."%");
$ query 변수에 무엇이 있는지 궁금합니다. 대신 이것을 시도하십시오
$query = '%'.$query.'%';
$numRecords->bind_param("s", $query);
대신 다음을 시도하십시오.
$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("ss", $table, "%$brand%");
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = mysql_num_rows($data);
$rows = getRowsByArticleSearch($query, $table, $max);
$last = ceil($rowcount/$page_rows);
}
Afaik MySQLI를 가진 식별자 및 진술을 준비하는 자리 표시자를 사용할 수 없습니다. 따라서 쿼리에 테이블 이름을 수동으로 보간해야합니다.