2013-03-17 7 views
5

Nel numero MySQL Reference Manual, esiste una distinzione tra istruzioni di definizione dei dati e istruzioni di manipolazione dei dati.Come ottenere il tipo di istruzione di una query in PDO?

Ora voglio sapere se una query inserisce un record di database, aggiorna uno, cancella uno o modifica la struttura della tabella e così via, o, più precisamente, il numero esatto di righe coinvolte, ma solo se è applicabile.

Ad esempio, l'istruzione

SELECT * 
FROM SomeTable 
WHERE id=1 OR id=2 

restituisce un numero di righe interessate (in questo caso), ma con l'affermazione SELECT, non c'è nulla modificato nel database, in modo che il numero sarebbe .

Come ottenere il tipo di query?

+1

Cosa c'è che non va con 'substr ($ query, 0, 6)'? –

+0

È anche possibile aggiungere un prefisso 'EXPLAIN' alla query? – hjpotter92

+1

@downvoters: Si prega di lasciare il vostro feedback di questo post in un commento. –

risposta

8

che stavo cercando la stessa risposta e ci siamo imbattuti this article. È stato aggiornato l'ultima volta in agosto. In esso, v'è una sezione: "Definizione del tipo di una dichiarazione" Si può sostanzialmente fare le seguenti ipotesi: (copiato da questo articolo)

  • Se columnCount() è pari a zero, la dichiarazione non ha un risultato impostato. Invece, ha modificato le righe ed è possibile richiamare rowCount() per determinare il numero di righe interessate.
  • Se columnCount() è maggiore di zero, l'istruzione ha prodotto un set di risultati ed è possibile recuperare le righe. Per determinare quante righe ci sono, contale mentre le prelevi.

Vi risparmio la fatica e basta incollare il codice di esempio qui

$sth = $dbh->prepare ($stmt); 
$sth->execute(); 
if ($sth->columnCount() == 0) 
{ 
    # there is no result set, so the statement modifies rows 
    printf ("Number of rows affected: %d\n", $sth->rowCount()); 
} 
else 
{ 
    # there is a result set 
    printf ("Number of columns in result set: %d\n", $sth->columnCount()); 
    $count = 0; 
    while ($row = $sth->fetch (PDO::FETCH_NUM)) 
    { 
    # display column values separated by commas 
     print (join (", ", $row) . "\n"); 
     $count++; 
    } 
} 
4

Ho pensato allo stesso problema e sono giunto alla conclusione che non ho bisogno di automazione in questa materia.

L'unico uso per tale rilevamento automatico è una funzione magica che restituirà il numero di righe interessate. Ma una tale magia, sebbene aggiunga un po 'di zucchero alla sintassi, rende sempre il supporto del codice un incubo:
Quando si chiama una funzione, e può restituire valori di tipi diversi dipende dal contesto, non si può dire quale sia restituito in ogni momento particolare. Quindi, rende più difficile il debugging.

Quindi, per motivi di leggibilità, basta chiamare la funzione appropriata per ottenere il risultato necessario al momento - affectedRows o numRows. Non renderà gonfio il tuo codice, ma lo renderà molto leggibile, .

-1

Sto usando questo:

substr($statement->queryString, 0, strpos($statement->queryString, ' ')); 

dove $ affermazione è un oggetto PDOStatement, alcuni le cose da notare qui sono che dovresti verificare prima di usare questa affermazione che $ è un oggetto PDOStatement, dovremmo anche prendere la strsc dall'istruzione substr nel caso in cui la stringa ritorta falsa, che probabilmente causerebbe un errore, infine, funziona solo w Con tipi di istruzioni di una parola, come SELECT, INSERT, ecc. e non tipi di istruzioni multi-word come ALTER TABLE