PHP를 사용하여 MySQL 데이터베이스를 작동 할 때 MySQL_Fetch_Assoc 함수는 쿼리 결과에서 데이터 행을 얻는 일반적인 방법입니다. 연관 배열을 반환하고 키 이름은 필드 이름에 해당하고 키 값은 필드 값에 해당합니다. 그러나 때때로 우리는 mysql_fetch_assoc이 빈 배열 또는 false를 반환하는 상황이 발생하여 프로그램이 데이터를 올바르게 처리하지 못하게합니다. 이 기사는이 문제의 몇 가지 일반적인 원인을 자세히 분석하고 해당 솔루션을 제공합니다.
가장 일반적인 이유는 실행 된 SQL 쿼리가 데이터 자체를 반환하지 않기 때문입니다. 예를 들어, 테이블의 조건을 충족시키는 레코드가 없으면 쿼리 결과가 비어 있고 mysql_fetch_assoc은 false를 반환하며 경우에 따라 데이터를 가져 오기 위해 while 루프를 사용할 때 빈 배열로 나타납니다.
샘플 코드 :
<?php
$link = mysql_connect('gitbox.net', 'username', 'password');
mysql_select_db('testdb', $link);
$result = mysql_query('SELECT * FROM users WHERE id = 99999', $link); // 가정id존재하지 않습니다
if (!$result) {
die('쿼리가 실패했습니다:' . mysql_error());
}
$row = mysql_fetch_assoc($result);
if ($row === false) {
echo "데이터가 반환되지 않습니다,쿼리 결과는 비어 있습니다";
} else {
print_r($row);
}
?>
해결책:
쿼리 조건이 올바른지 확인하고 조건을 충족하는 데이터 테이블에 레코드가 있는지 확인하십시오.
SQL 명령문 구문 오류 또는 기타 이유로 인해 쿼리가 실패하면 MySQL_Query가 False를 반환합니다. MySQL_Fetch_Assoc 에 전달 된 것은 유효한 결과 자원이 아니므로 데이터는 자연스럽게 검색되지 않습니다.
샘플 코드 :
<?php
$link = mysql_connect('gitbox.net', 'username', 'password');
mysql_select_db('testdb', $link);
$result = mysql_query('SELECT * FORM users', $link); // 구문 오류:FORM 그럴 것입니다 FROM
if (!$result) {
die('쿼리가 실패했습니다:' . mysql_error());
}
$row = mysql_fetch_assoc($result); // 여기에서 실행되지 않습니다,위의 것이 종료 되었기 때문입니다
?>
해결책:
쿼리를 실행 한 후 $ result가 False 인지 확인하십시오. 실패한 경우 mysql_error ()를 사용하여 오류 메시지를보고 SQL 구문을 수정하십시오.
데이터베이스 연결에 실패하거나 데이터베이스 선택이 실패하면 쿼리를 전혀 실행할 수 없으므로 예외적 인 결과가 발생합니다.
샘플 코드 :
<?php
$link = mysql_connect('gitbox.net', 'username', 'wrongpassword');
if (!$link) {
die('연결이 실패했습니다:' . mysql_error());
}
$db_selected = mysql_select_db('testdb', $link);
if (!$db_selected) {
die('데이터베이스를 선택하지 못했습니다:' . mysql_error());
}
?>
해결책:
데이터베이스 연결 매개 변수가 정확하고 데이터베이스가 존재하고 데이터베이스의 연결 및 선택이 성공했는지 확인하십시오.
mysql_fetch_assoc을 호출 할 때마다 포인터가 뒤로 이동하고 다음 줄을 읽습니다. 여러 통화 후 포인터가 종말에 도달하면 호출이 거짓을 반환합니다.
샘플 코드 :
<?php
$link = mysql_connect('gitbox.net', 'username', 'password');
mysql_select_db('testdb', $link);
$result = mysql_query('SELECT * FROM users', $link);
while ($row = mysql_fetch_assoc($result)) {
print_r($row);
}
// 포인터가 끝났습니다,다음 통화를 반환합니다 false
$next = mysql_fetch_assoc($result);
var_dump($next); // bool(false)
?>
해결책:
결과를 여러 번 통과 해야하는 경우 데이터를 배열에 저장하거나 쿼리를 다시 실행하는 것이 좋습니다.
PHP 관계자는 MySQL_* 일련의 기능을 포기했으며 대신 MySQLI 또는 PDO를 사용하는 것이 좋습니다. 오래된 MySQL_* 함수는 새로운 환경에서 불안정 할 수 있습니다.
대신 mysqli를 사용하십시오.
<?php
$link = mysqli_connect('gitbox.net', 'username', 'password', 'testdb');
if (!$link) {
die('연결이 실패했습니다:' . mysqli_connect_error());
}
$result = mysqli_query($link, 'SELECT * FROM users');
if (!$result) {
die('쿼리가 실패했습니다:' . mysqli_error($link));
}
while ($row = mysqli_fetch_assoc($result)) {
print_r($row);
}
mysqli_close($link);
?>
mysql_fetch_assoc 빈 배열 또는 false를 반환합니다. 일반적으로 다음 요소와 관련이 있습니다.
쿼리 결과 자체가 비어 있습니다.
SQL 명령문 실행이 실패했습니다.
데이터베이스 연결 또는 선택이 실패했습니다.
결과 세트 포인터가 끝났습니다.
오래된 MySQL 확장자를 사용하십시오.
SQL 문, 연결 상태 및 쿼리 결과를 확인하면 문제의 근본 원인을 찾아 MySQLI 또는 PDO로 업그레이드하여 코드 보안 및 안정성을 향상시킬 수 있습니다.