2012-08-15 10 views
21

Chcę mieć warunek, że wiersz nie istnieje wcale.PDO/PHP - Sprawdź, czy istnieje wiersz

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

Tried if (count($row) == 0) i if($stmt->rowCount() < 0) ale żaden z nich nie działa.

+1

[ '$ stmt-> rowCount()'] (http://php.net/manual/en/pdostatement.rowcount.php) powinien być tym, czego potrzebujesz, ale sprawdzenie, czy jest * mniej niż * '0' nie pomoże - będzie równe *' 0' lub * mniej niż * '1' – DaveRandom

+1

@DaveRandom Dokumenty stwierdzają, że nie wszystkie sterowniki powoduje, że 'SELECT' daje' rowCount'. Podobno powinieneś używać 'columnCount'. –

+0

@arxanas Sprzeczny punkt, ale szczerze mówiąc dwa pytania tylko po to, by uzyskać liczbę wierszy (jak sugeruje podręcznik), jest niefortunnym rozwiązaniem. Nawet '$ rowCount = count ($ rows = $ stmt-> fetchAll())' jest lepszym rozwiązaniem niż to, czuję - i nadal będzie skutkować '0', jeśli nie ma żadnych wierszy. – DaveRandom

Odpowiedz

53

Możesz bezpośrednio sprawdzić wartość zwrotu.

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

Jeśli proszą o sprawdzenie bez pobierania po prostu mieć MySQL zwracają 1 (lub użyć polecenia 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

Twoje rozwiązanie będzie działać, ale nie jest prawdą, że 'PDOStatement :: fetch' zwraca tablicę; zwraca następny wynik lub "fałsz", jeśli nie ma już wierszy. I dlatego '$ row' jest fałszywe, gdy jest pusty zestaw wyników. –

+0

@ matthias.p, dzięki za poprawkę. Nigdy nie używam 'fetch()', więc moje oświadczenie o pustej tablicy pochodziło z 'fetchAll()' – Xeoncross

+0

Dzięki! właśnie tego szukałem. Ponieważ wiedziałem, że wynikiem jest powrót w tablicy, pomyślałem, że może to być najlepszy sposób sprawdzenia zmiennej zamiast używania funkcji lub wykonania innego zapytania sql. – xperator

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

powinny działać prawidłowo, ponieważ liczba wierszy nie może być mniejsza niż zero w każdym razie w ogóle.

Z instrukcji:

Dla większości baz danych, PDOStatement::rowCount() nie zwraca liczbę wierszy dotkniętych SELECT oświadczeniu. Zamiast tego należy użyć PDO::query() wydać SELECT COUNT(*) oświadczenie z tych samych orzeczników jak zamierzonego SELECT rachunku, a następnie użyć PDOStatement::fetchColumn() aby pobrać liczbę wierszy, które będą być zwrócone. Twoja aplikacja może następnie wykonać poprawną akcję.

Sugerowałbym czytanie na ten temat here.

+1

Jako arxanas już powiedział, nie powinieneś używać 'rowCount' do wykrywania wierszy zwróconych przez instrukcję select. –

+0

Jeśli używasz MySQL, nie powinno to stanowić problemu, ale poza tym jesteś całkowicie poprawny. – DannyCruzeira

+2

oh wtedy użyłem niewłaściwego znaku.Pomyślałem, że jeśli istnieje, gdy jest większa, powinienem odwrócić go do mniej niż 0! lol – xperator

0

Herezje co używam w moich klas obiektów:

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