2012-05-09 14 views
15

Ho trovato molti modi per utilizzare la dichiarazione exec per PDO, ma non sono sicuro che mi aiuti. La mia comprensione è che devo usare la funzione execute() per le istruzioni preparate. Sto aggiornando una riga con i dati dell'input dell'utente, quindi mi piacerebbe usare una dichiarazione preparata invece della chiamata a query().DOP erano righe interessate durante l'istruzione di esecuzione

Il mio codice è il seguente:

$dbh = buildDBConnector(); 
$sql = "UPDATE tb_users 
    SET authState=1 
    WHERE id = ? AND authPass = ?"; 
$q = $dbh->prepare($sql); 
$f = $q->execute(array($id,$authPass)); 
if($f){ 
    echo '<br />Success<br />'; 
}else{ 
    echo '<br />Failure<br />'; 
} 

Il problema è che la query stessa è esente da errori ed esegue bene, quindi non c'è la mancata memorizzazione in $ f. Tuttavia, ho bisogno di sapere se effettivamente ha trovato la riga da aggiornare, quindi l'ho aggiornata con successo. In altre parole, ho bisogno delle righe interessate. Quando googling e così, continua a venire alla dichiarazione exec, ma dalla mia comprensione, exec non è per le dichiarazioni preparate? Eventuali suggerimenti?

+0

Attenzione: se il valore è * già * impostato (l'aggiornamento viene eseguito due volte, forse da un doppio pulsante di invio cliccato) la seconda volta causerebbe un errore anche se i dati sono corretti. Per l'esperienza utente, potrebbe essere più affidabile eseguire in seguito un'istruzione select per vedere se il record esiste con il valore corretto 'select authState da tb_users dove id =? e authPass =? '. Nessun risultato significa che l'ID o la password non esiste. (ps spero che tu abbia cancellato le password! guarda pbdkf2!) –

risposta

29

Prova $q->rowCount(). Le istruzioni preparate restituiranno il numero di righe interessate tramite tale metodo.

+7

tieni presente che per impostazione predefinita, MySQL restituisce il numero di righe effettivamente modificate, e non il numero di righe corrispondenti dalla clausola where (che rilascia aggiornamento con gli stessi valori di quelli esistenti non cambiano la riga) –

+1

So che molte persone cercano questa domanda a giudicare dalle cose che ho letto sul web, ottimo lavoro sulla risposta rapida! Il $ f finito non è necessario quando tutto è stato detto e fatto, può essere terminato come segue: if ($ q-> rowCount()) {... – MaurerPower

+6

USE: $ q-> rowCount() QUESTO Dà UN ERRORE: $ f-> rowCount() –

14

$q->rowCount() restituisce il numero di righe interessate dall'ultima dichiarazione (eseguito) SQL dove $q è la dichiarazione preparata che viene spesso chiamato $stmt.

Così la maggior parte degli utenti che hanno letto questo potrebbe volere qualcosa di simile:

$pdo = new PDO($dsn, $username, $password); 
$sql = "UPDATE tb_users SET authState=1 WHERE id = ? AND authPass = ?"; 
$stmt = $dbh->prepare($sql); 
$stmt->execute(array($id, $authPass)); 

if ($stmt->rowCount()){ 
    echo 'Success: At least 1 row was affected.'; 
} else{ 
    echo 'Failure: 0 rows were affected.'; 
} 
-2

penso che DOP rowCount() è inutile in MySQL con query di singolo aggiornamento. perché restituisce sempre 0;

ex: 
TABLE{id=1, col1="A"} 
UPDATE TABLE SET col1="AA" WHERE id=1; 
rowCount will return 0; 

also 
UPDATE TABLE SET col1="AA" WHERE id=999; 
rowCount will return 0; 

so rowCount() is useless in this case. 

non ho ancora testato con questa query UPDATE TAVOLA col1 = "AA"

0

di rowCount() dalle dichiarazioni dichiarazioni preparate righe interessate se si tratta di una dichiarazione UPDATE, DELETE o INSERT DOP. Altrimenti restituisce quante righe vengono restituite dall'istruzione SELECT.

7

Una nota a margine: quando si aggiorna una tabella con valori identici rowCount() restituirà sempre 0. Questo è un comportamento normale. È possibile modificare da soli a partire da PHP 5.3 con la creazione di un oggetto PDO con i seguenti attributi:

<? php 
$p = new PDO($dsn, $user, $pass, array(PDO::MYSQL_ATTR_FOUND_ROWS => true)); 
?> 

Il rowCount() poi tornerà quante righe l'aggiornamento-query effettivamente trovato/abbinato.

+0

Non avevo idea che fosse una cosa !!Tutto il si! – Gurnzbot

Problemi correlati