Walrus
Walrus

Reputation: 20444

PHP PDO mySQL return null

The following code returns me people with similar telephone numbers. It works perfectly but when there are no numbers the function still returns information meaning that I cannot check hide a certain box if there are no other people with similar numbers.

THE FUNCTION

function getothers($tid,$criteria,$telephone,$telephone2,$elector){
            global $dbh;
            $tid = '-TID'.$tid;
             $sql = "SELECT * FROM electors WHERE ((telephone > 0 AND telephone IN ('$telephone','$telephone2'))  OR (telephone2 > 0 AND telephone2 IN ('$telephone','$telephone2'))) $criteria AND records NOT RLIKE '$tid' AND ID != '$elector'  LIMIT 10";
            $result = $dbh->query($sql);
            return $result;
        }

THE CALL

<?php $others = getothers($post['TID'],$post['criteria'],$elector['telephone'],$elector['telephone2'],$elector['ID']); ?>

THE LINE THAT DOES NOT WORK

<?php if(!$others){?> 

$others still has something in it despite no results. I think I might be missing a line in y PDO. Any ideas?

The print_r

PDOStatement Object ( [queryString] => SELECT * FROM electors WHERE ((telephone > 0 AND telephone IN ('02085414023 ','')) OR (telephone2 > 0 AND telephone2 IN ('02085414023 ',''))) AND (this_vi_street = '' AND this_vi_telephone = '') AND (mosaic IN ('A01','A02','A03','A04','A05','A07','B11','C15','C16','C17','C18','H46','J52','K57','K58','K60') OR last_vi IN ('C','P')) AND postal_vote != 1 AND records NOT RLIKE '-TID1' AND ID != '13' LIMIT 10 )

Upvotes: 0

Views: 745

Answers (2)

deceze
deceze

Reputation: 522081

As per the comments, a version using prepared statements:

function getothers($tid, $criteria, $telephone, $telephone2, $elector) {
    global $dbh;

    $stmt = $dbh->prepare("SELECT *
                             FROM electors
                            WHERE ((telephone > 0 AND telephone IN (:telephone, :telephone2))
                                   OR (telephone2 > 0 AND telephone2 IN (:telephone, :telephone2)))
                                  $criteria
                                  AND records NOT RLIKE :tid
                                  AND ID != :elector
                            LIMIT 10";

    $stmt->execute(array(
        ':telephone'  => $telephone,
        ':telephone2' => $telephone2,
        ':tid'        => '-TID' . $tid,
        ':elector'    => $elector
    ));

    return $stmt->fetchAll();
}

There are still some bad points in this code:

  • Uses global to get the DB connection, this is overall bad application structure. You should probably use a class or pass $dbh as a regular argument into the function.
  • Concatenates $criteria into the prepared statement. Do you really need such dynamic conditions that you can't prepare a query for it without concatenating whole SQL blocks into it?
  • Doesn't necessarily address your actual problem of function returns.

Upvotes: 1

allen213
allen213

Reputation: 2277

Maybe do something like

$result = $dbh->query($sql);
if($result->rowCount()>0)
{
return $result;
}

return false;

Upvotes: 0

Related Questions