2012-08-15 68 views
21

Quiero tener una condición en caso de que la fila no exista.PDO/PHP - Compruebe si existe fila

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

Probamos if (count($row) == 0) y if($stmt->rowCount() < 0) pero ninguno de ellos trabaja.

+1

[ '$ stmt-> rowCount()'] (http://php.net/manual/en/pdostatement.rowcount.php) debe sea ​​lo que necesite, pero comprobar si es * menor que * '0 'no ayudará - será * igual a *' 0' o * menor que * '1' – DaveRandom

+1

@DaveRandom Los documentos indican que no todos los controladores causa 'SELECT' para dar un' rowCount'. Aparentemente deberías estar usando 'columnCount'. –

+0

@arxanas Un punto justo, pero ejecutar francamente dos consultas solo para obtener el recuento de filas (como sugiere el manual) es una solución sucky. Incluso '$ rowCount = count ($ rows = $ stmt-> fetchAll())' es una mejor solución que esa, creo, y aún dará como resultado '0' si no hay filas. – DaveRandom

Respuesta

53

Puede verificar directamente el valor devuelto.

$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'); 
} 
*/ 

Si se está preguntando acerca de la comprobación sin recuperar ni entonces simplemente tiene MySQL devuelve un 1 (o utilice el comando 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

Su solución funcionará, pero no es cierto que 'PDOStatement :: fetch' devuelve una matriz; devuelve el siguiente resultado o 'falso' si ya no hay filas. Y es por eso que '$ row' es falso cuando hay un conjunto de resultados vacío. –

+0

@ matthias.p, gracias por la corrección. Nunca uso 'fetch()' así que mi declaración sobre una matriz vacía era de 'fetchAll()' – Xeoncross

+0

¡Gracias! eso es lo que estaba buscando. Como sabía que el resultado era un retorno en una matriz, estaba pensando que podría ser la mejor forma de verificar la variable en lugar de utilizar una función o hacer otra consulta SQL. – xperator

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

debería funcionar bien, ya que el número de filas no puede ser inferior a cero en cualquier caso en absoluto.

Del manual:

Para la mayoría de las bases de datos, PDOStatement::rowCount() no devuelve el número de filas afectadas por una declaración SELECT. En su lugar, utilice PDO::query() a emitir una declaración SELECT COUNT(*) con los mismos predicados como su SELECT declaración con el propósito, a continuación, utilizar PDOStatement::fetchColumn() para recuperar el número de filas que ser devueltos. Su aplicación puede realizar la acción correcta.

Yo sugeriría leer en ese here.

+1

Como arxanas ya dicho, usted no debe usar 'rowCount' para detectar las filas devueltas por una declaración de selección. –

+0

Si está utilizando MySQL no debería ser un problema, pero de lo contrario está completamente en lo cierto. – DannyCruzeira

+2

oh, entonces estaba usando el signo equivocado.¡Pensé que si existe cuando es mayor, debería invertirlo a menos de 0! lol – xperator

0

Esto es lo que utilizo en mis clases de objetos:

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