source

빈 결과 확인(PHP, PDO 및 MySQL)

gigabyte 2022. 9. 8. 22:21
반응형

빈 결과 확인(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_emailvariable)을 사용하여 쿼리가 반환했는지 여부를 나타냅니다.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

반응형