2012-08-15 119 views
21

我想有一个条件,因为行根本不存在。PDO/PHP - 检查行是否存在

$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)但他们没有工作。

+1

['$ stmt-> rowCount时()'](http://php.net/manual/en/pdostatement.rowcount.php)应是你需要的,但检查它是否*小于*'0'不会有帮助 - 它将*等于*'0'或*小于*'1' – DaveRandom 2012-08-15 18:05:29

+1

@DaveRandom文档声明并非所有的驱动程序导致'SELECT'给出'rowCount'。显然你应该使用'columnCount'。 – 2012-08-15 18:07:43

+0

@arxanas一个公平点,但坦率地说,只是为了获得行数(如手册所示)而运行两个查询是一个糟糕的解决方案。即使'rowCount = count($ rows = $ stmt-> fetchAll())'是比这更好的解决方案,我觉得 - 如果没有行,它仍然会导致“0”。 – DaveRandom 2012-08-15 18:13:41

回答

53

您可以直接检查返回值。

$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) 
{ 
    die('nothing found'); 
} 

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

如果你问有关检查并不获取然后只需有MySQL的返回一个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()) die('found'); 
+8

你的解决方案可以工作,但是'PDOStatement :: fetch'返回一个数组并不正确。它返回下一个结果,如果没有行,则返回'false'。这就是为什么当有空结果集时'$ row'是错误的。 – 2012-08-15 18:10:31

+0

@ matthias.p,感谢您的更正。我从来不使用'fetch()',所以我关于一个空数组的声明来自'fetchAll()' – Xeoncross 2012-08-15 18:12:36

+0

谢谢!这就是我一直在寻找的东西。由于我知道结果是返回一个数组,我认为这可能是检查变量而不是使用函数或执行另一个SQL查询的最佳方法。 – xperator 2012-08-15 19:21:57

7
if($stmt->rowCount() == 0) 

应该可以正常工作,因为行的数目在任何情况下不能小于零的。

从手册:

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

我建议读一读here

+1

由于arxanas已经说,你不应该使用'rowCount'来检测select语句返回的行。 – 2012-08-15 18:14:08

+0

如果你使用MySQL,它不应该是一个问题,但否则你是完全正确的。 – DannyCruzeira 2012-08-15 18:24:46

+2

哦,然后我使用了错误的标志。我认为,如果它存在的时候更大,我应该把它扭转到小于0!大声笑 – xperator 2012-08-15 19:23:34

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; 
    } 
}