PDO query is always returning 1 or true

2019-02-25 06:26发布

问题:

I am trying to check if a row exists before I delete it. The row in my table doesn't exist but it always returns 1:

$orders = $this->db->prepare("SELECT * FROM orders WHERE id=? AND user=?"); 
            $check = $orders->execute(array($message,$this->model->checkapi($data,$message)));
            echo $check;
            if($check){
            $deleteorder = $this->db->prepare("DELETE FROM orders WHERE id=? AND user=?"); 
            $deleteorder->execute(array($message,$this->model->checkapi($data,$message)));
                array_push($result, array('success' => true,
                                          'deleted' => $message));
                echo json_encode(array("result" => $result));
                die();
            }else{

$this->model->checkapi($data,$message) returns fakeusername and id/$message returns 136

I've checked my database, the ID exists, but not the id and username together.

I'm sending id: 136 and username: fakeuser

in the databse the row exists as id:136 and username: demo.

I'm not sure why it's returning 1 when the row shouldn't be selected due to it not matching.

回答1:

You should use fetch() after execute(), because execute() just returns TRUE on success or FALSE on failure :

$orders->execute(...
$result = $orders->fetch(PDO::FETCH_ASSOC);
print_r($result);


回答2:

When execute succeeds, it returns TRUE. In your case, the query succeeds, it just returns 0 rows, which is a completely valid result. If you want to check whether the query returned any rows, you could attempt to fetch from the result:

$orders->execute(array($message,$this->model->checkapi($data,$message)));
$check = $orders->fetch();
if ($check) {

Having said that, this entire approach strikes me as wrong - deleting a single row isn't a considerably heavier operation than querying that row, if at all. And in the worst case, where it exists, you're performing two statements instead of one. I'd just go ahead and send the delete statement, and if it doesn't affect any rows (because they don't exist), so be it.