빈 결과 확인(PHP, PDO 및 MySQL)
내가 여기서 뭘 잘못하고 있는 거지?테이블에서 결과를 가져와 배열에 추가하는 것 뿐입니다.빈 결과를 확인할 때까지 모든 것이 예상대로 작동합니다.
그러면 일치하는 항목이 검색되어 어레이에 추가되고 예상대로 결과가 에코됩니다.
$today = date('Y-m-d', strtotime('now'));
$sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");
$sth->bindParam(':today', $today, PDO::PARAM_STR);
if(!$sth->execute()) {
$db = null;
exit();
}
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
$this->id_email[] = $row['id_email'];
echo $row['id_email'];
}
$db = null;
return true;
빈 결과를 확인하려고 하면 코드가 'empty'를 반환하지만 더 이상 일치하는 결과를 생성하지 않습니다.
$today = date('Y-m-d', strtotime('now'));
$sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");
$sth->bindParam(':today',$today, PDO::PARAM_STR);
if(!$sth->execute()) {
$db = null;
exit();
}
if ($sth->fetchColumn()) {
echo 'not empty';
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
$this->id_email[] = $row['id_email'];
echo $row['id_email'];
}
$db = null;
return true;
}
echo 'empty';
$db = null;
return false;
결과 행을 버릴 때$sth->fetchColumn()
결과가 있는지 확인하는 방법이 아닙니다.넌 그래.
if ($sth->rowCount() > 0) {
... got results ...
} else {
echo 'nothing';
}
관련 매뉴얼은 이쪽: PDOStement: rowCount
fetchAll()을 사용하는 옵션이 있는 경우 행이 반환되지 않으면 빈 배열이 됩니다.
count($sql->fetchAll(PDO::FETCH_ASSOC))
반환된 행 수를 반환합니다.
SELECT 문에는 이식할 수 없으므로 rowCount를 사용하지 마십시오.Isset 함수를 사용하여 select 문이 작동하는지 테스트합니다.
$today = date('Y-m-d', strtotime('now'));
$sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");
// I would usually put this all in a try/catch block, but I kept it the same for continuity
if(!$sth->execute(array(':today'=>$today)))
{
$db = null;
exit();
}
$result = $sth->fetch(PDO::FETCH_OBJ)
if(!isset($result->id_email))
{
echo "empty";
}
else
{
echo "not empty, value is $result->id_email";
}
$db = null;
물론 이는 데이터셋을 루프할 때처럼 단일 결과를 위한 것입니다.
나는 최근에 이 일을 처리해야 했기 때문에 관여해야겠다고 생각했다.
$sql = $dbh->prepare("SELECT * from member WHERE member_email = '$username' AND member_password = '$password'");
$sql->execute();
$fetch = $sql->fetch(PDO::FETCH_ASSOC);
// if not empty result
if (is_array($fetch)) {
$_SESSION["userMember"] = $fetch["username"];
$_SESSION["password"] = $fetch["password"];
echo 'yes this member is registered';
}else {
echo 'empty result!';
}
내가 여기서 뭘 잘못하고 있는 거지?
거의 다.
$today = date('Y-m-d'); // no need for strtotime
$sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");
$sth->bindParam(':today',$today); // no need for PDO::PARAM_STR
$sth->execute(); // no need for if
$this->id_email = $sth->fetchAll(PDO::FETCH_COLUMN); // no need for while
return count($this->id_email); // no need for the everything else
실제로는, 취득한 데이터는 항상 가지고 있습니다(이 경우는,$this->id_email
variable)을 사용하여 쿼리가 반환했는지 여부를 나타냅니다.PDO에 대한 자세한 내용은 제 기사를 참조하십시오.
고려해야 할 또 하나의 접근법:
HTML 테이블이나 기타 데이터베이스 의존적인 콘텐츠를 작성할 때(통상 AJAX 호출을 통해), 마크업을 수행하기 전에 SELECT 쿼리가 데이터를 반환했는지 확인합니다.데이터가 없으면 "데이터를 찾을 수 없습니다.그런 취지의 말인 것 같아요.데이터가 있는 경우는, 헤더를 작성하고, 컨텐츠를 루프 하는 등, 계속해 주세요.데이터베이스를 MySQL로 한정할 예정이지만, 저는 휴대용 코드를 쓰는 것을 선호하기 때문에 rowCount()는 아웃입니다.대신 열 수를 확인하십시오.행을 반환하지 않는 쿼리는 열도 반환하지 않습니다.
$stmt->execute();
$cols = $stmt->columnCount(); // no columns == no result set
if ($cols > 0) {
// non-repetitive markup code here
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
전 오직 한가지 방법만 찾았어요...
$quote = $pdomodel->executeQuery("SELECT * FROM MyTable");
//if (!is_array($quote)) { didn't work
//if (!isset($quote)) { didn't work
if (count($quote) == 0) { //yep the count worked.
echo 'Record does not exist.';
die;
}
Marc B의 도움 덕분에 나에게 효과가 있었습니다(주의: Marc의 rowCount() 제안도 효과가 있었습니다만, 다른 데이타베이스에서 동작하지 않거나, 내 데이타베이스에 뭔가 변화가 생겼을 가능성이 있어 불편했습니다).또, 그의 셀렉트 카운트(*)의 제안도 유효합니다만, 어쨌든 있으면 데이터를 얻을 수 있을 것 같아서, 이쪽을 선택하게 되었습니다.
$today = date('Y-m-d', strtotime('now'));
$sth = $db->prepare("SELECT id_email FROM db WHERE hardcopy = '1' AND hardcopy_date <= :today AND hardcopy_sent = '0' ORDER BY id_email ASC");
$sth->bindParam(':today', $today, PDO::PARAM_STR);
if(!$sth->execute()) {
$db = null;
exit();
}
while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
$this->id_email[] = $row['id_email'];
echo $row['id_email'];
}
$db = null;
if (count($this->id_email) > 0) {
echo 'not empty';
return true;
}
echo 'empty';
return false;
언급URL : https://stackoverflow.com/questions/13478206/checking-for-an-empty-result-php-pdo-and-mysql
'source' 카테고리의 다른 글
Django & MariaDB / MySQL : select_for_update lock 행을 서브쿼리에서 선택합니까?교착상태의 원인? (0) | 2022.09.08 |
---|---|
MySQL의 열 값 스왑 (0) | 2022.09.08 |
문자열에서 하위 문자열의 마지막 항목 색인 찾기 (0) | 2022.09.08 |
함수 이름을 문자열로 가져오려면 어떻게 해야 합니까? (0) | 2022.09.08 |
vuex에서의 mapState, mapGetters, mapActions, mapMetations의 차이점 (0) | 2022.09.08 |