while 루프 오류를 일으키는 준비된 문
문제
다음과 같은 간단한 mysqli php 애플리케이션이 있는데, 잘 작동할 것입니다.$pk는 완벽하게 허용되며 유효한 ARTICLE_NO이며 쿼리는 mysql에서 직접 실행할 때 완벽하게 작동합니다.실행하는 동안 테스팅을 제외한 모든 이벤트와 모든 이벤트 뒤에 출력 문을 넣었습니다.while 루프는 입력되지 않으며 이유가 확실하지 않습니다.
편집하다:0 행이 반환된다는 사실로 문제의 범위를 좁혔지만 phpmyadmin의 동일한 쿼리가 올바른 결과를 제공하는 이유를 알 수 없습니다.
편집2:while 루프를 제거하고 그냥
if (!$getRecords->fetch()) {
printf("<p>ErrorNumber: %d\n", $getRecords->errno);
}
errno가 0임을 보여줍니다.따라서 레코드를 가져오지 않고 오류도 없지만 유효한 쿼리입니다.
<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
$pk = $_GET["pk"];
$con = mysqli_connect("localhost", "", "", "");
if (!$con) {
echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error();
exit;
}
$con->set_charset("utf8");
echo "test outside loop";
if(1 < 2) {
echo "test inside loop";
$query1 = 'SELECT ARTICLE_NO FROM AUCTIONS WHERE ARTICLE_NO = ?';
if ($getRecords = $con->prepare($query1)) {
echo "inside second loop";
$getRecords->bind_param("i", $pk);
echo "test after bind param";
$getRecords->execute();
echo "test after bind execute";
$getRecords->bind_result($ARTICLE_NO);
echo "test after bind result";
while ($getRecords->fetch()) {
echo "test inside while";
echo "<h1>".$ARTICLE_NO."</h1>";
}
}
}
편집하다:
이 코드로 시도했습니다.
<?php
$mysqli = new mysqli("localhost", "", "", "");
$pk = $_GET["pk"];
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* prepare statement */
if ($stmt = $mysqli->prepare("SELECT ARTICLE_NAME, WATCH FROM AUCTIONS WHERE ARTICLE_NO = ? LIMIT 5")) {
$stmt->bind_param("i", $pk);
$stmt->execute();
/* bind variables to prepared statement */
$stmt->bind_result($col1, $col2);
/* fetch values */
while ($stmt->fetch()) {
printf("%s %s\n", $col1, $col2);
}
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
?>
이것은 $pk 없이 작동합니다. 매개변수를 제거하면 제대로 작동합니다.$pk = 1; 을 할당하면 GET을 통해 pk를 얻는 데에는 문제가 없습니다.대신 여전히 실패합니다.1은 유효한 ARTICLE_NO이고 ARTICLE_NAME을 선택하고 ARTICLE_NO = 1 LIMIT 5인 경매에서 시청하면 phmyadmin에서 제대로 작동합니다.
편집하다:문제는 mysqli가 bigint를 처리할 수 없다는 것이었습니다. 이제 k를 문자열로 사용하고 있는데 잘 작동합니다.
해결책
다음 값을 확인하세요.
$getRecords->num_rows
이는 이전에 SELECT
실제로 모든 데이터를 반환하고 있습니다.
다음을 추가해야 할 수도 있습니다.
$getRecords->store_result()
먼저 결과 집합의 행 수를 요청하기 전에 전체 쿼리가 완료되었는지 확인하세요.
또한 - 꼭 캐스팅하세요 $pk
정수로!전달되는 값이 손상될 가능성이 있습니다.
다른 팁
해당 코드를 수정했는지는 확실하지 않지만 거기에 연결하려는 데이터베이스를 선택하지 않은 것 같습니다.
그것이 문제라면 mysqli_select_db(...)를 사용하십시오.
편집하다:또한 열, 테이블 이름 등에 대문자를 사용하고 있는 것 같습니다.
대소문자를 올바르게 구분하십시오. 명령줄에서 작동하기 때문에 대소문자를 구분하지 않는다고 가정할 수 있습니다.내가 아는 한, PHP의 mysqlI 드라이버는 최소한 열 이름에 대해 대소문자를 구분합니다.