2012-08-15 11 views
21

Voglio avere una condizione in cui la riga non esiste affatto.PDO/PHP - Controllare se esiste una riga

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

provato if (count($row) == 0) e if($stmt->rowCount() < 0) ma nessuno di loro opere.

+1

[ '$ stmt-> rowCount()'] (http://php.net/manual/en/pdostatement.rowcount.php) dovrebbe essere quello di cui hai bisogno, ma controllare se è * meno di * '0' non aiuterà - sarà * uguale a *' 0' o * minore di * '1' – DaveRandom

+1

@DaveRandom I documenti affermano che non tutti i driver causa 'SELECT' per dare un' rowCount'. A quanto pare dovresti effettivamente usare 'columnCount'. –

+0

@arxanas Un punto equo, ma francamente eseguendo due query solo per ottenere il conteggio delle righe (come suggerisce il manuale) è una soluzione sucky. Anche '$ rowCount = count ($ rows = $ stmt-> fetchAll())' è una soluzione migliore di quella, credo - e restituirà ancora '0' se non ci sono righe. – DaveRandom

risposta

53

È possibile controllare direttamente il valore restituito.

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

Se ti stai chiedendo circa il controllo senza caricare poi semplicemente hanno MySQL restituire un 1 (oppure utilizzare il 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

La tua soluzione funzionerà, ma non è vero che 'PDOStatement :: fetch' restituisca una matrice; restituisce il risultato successivo o 'false' se non ci sono più righe. Ed ecco perché '$ row' è falso quando c'è un set di risultati vuoto. –

+0

@ matthias.p, grazie per la correzione. Non ho mai usato 'fetch()' quindi la mia affermazione su un array vuoto era da 'fetchAll()' – Xeoncross

+0

Grazie! questo è quello che stavo cercando. Poiché sapevo che il risultato era il ritorno in un array, stavo pensando che potesse essere il modo migliore per controllare la variabile invece di usare una funzione o fare un'altra query sql. – xperator

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

dovrebbe funzionare bene, poiché il numero di righe non può essere minore di zero in ogni caso a tutti.

Dal manuale:

Per la maggior parte dei database, PDOStatement::rowCount() non restituisce il numero di righe interessate da un'istruzione SELECT. Invece, utilizzare PDO::query() a rilasciare una dichiarazione SELECT COUNT(*) con gli stessi predicati come vostro destinato SELECT dichiarazione, quindi utilizzare PDOStatement::fetchColumn() per recuperare il numero di righe che saranno essere restituiti. L'applicazione può quindi eseguire l'azione corretta.

Suggerirei di leggere su quello here.

+1

As arxanas già detto, non si dovrebbe usare 'rowCount' per rilevare le righe restituite da un'istruzione select. –

+0

Se stai usando MySQL non dovrebbe essere un problema, ma per il resto sei completamente corretto. – DannyCruzeira

+2

oh allora stavo usando il segno sbagliato.Ho pensato che se esiste quando è maggiore, dovrei semplicemente capovolgerlo a meno di 0! lol – xperator

0

Heres quello che uso nelle mie classi di oggetti:

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