33

我想要一个条件,当该行根本不存在时执行一些操作。

$stmt = $conn->prepare('SELECT * FROM table WHERE ID=?');
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);

试过了if (count($row) == 0)if($stmt->rowCount() < 0)但没有一个有效。

4

3 回答 3

79

您可以直接检查返回值。

$stmt = $conn->prepare('SELECT * FROM table WHERE ID=?');
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);

if( ! $row)
{
    echo 'nothing found';
}

/*
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // Same here
if( ! $rows)
{
    echo 'nothing found';
}
*/

如果您询问不获取的检查,那么只需让 MySQL 返回 a 1(或使用COUNT()命令)。

$sql = 'SELECT 1 from table WHERE id = ? LIMIT 1';
//$sql = 'SELECT COUNT(*) from table WHERE param = ?'; // for checking >1 records
$stmt = $conn->prepare($sql);
$stmt->bindParam(1, $_GET['id'], PDO::PARAM_INT);
$stmt->execute();

if($stmt->fetchColumn()) echo 'found';
于 2012-08-15T18:07:17.103 回答
10
if($stmt->rowCount() == 0) 

应该可以正常工作,因为无论如何行数都不能小于零。

从手册:

对于大多数数据库,PDOStatement::rowCount()不返回受SELECT语句影响的行数。相反,使用 PDO::query()发出SELECT COUNT(*)与预期语句具有相同谓词的SELECT语句,然后使用 PDOStatement::fetchColumn()检索将返回的行数。然后,您的应用程序可以执行正确的操作。

我建议在这里阅读。

于 2012-08-15T18:12:16.193 回答
0

这是我在对象类中使用的内容:

function exists_by_id () {
    // check if object exists by id
    $stm = DB::$pdo->prepare('select count(*) from `table` where `column`=:column');
    $stm->bindParam(':column', $this->column);
    $stm->execute();
    $res = $stm->fetchColumn();

    if ($res > 0) {
        return true;
    }
    else {
        return false;
    }
}
于 2017-01-05T16:39:25.077 回答