[Risolto][PHP] Dubbio PDO

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Xeyos
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 463
Iscrizione: lunedì 26 maggio 2008, 14:16

[Risolto][PHP] Dubbio PDO

Messaggio da Xeyos »

Domanda spero abbastanza semplice:

Fra le due implementazioni quale risulta più sicura:

Opzione 1

Codice: Seleziona tutto

public function select($sql, $array = array(), $fetchMode = PDO::FETCH_ASSOC) {
        $sth = $this->prepare($sql);
        foreach ($array as $key => $value) {
            $sth->bindValue($key, $value);
        }
        $sth->execute() or die(print_r($sth->errorInfo(),true));

        return $sth->fetchAll($fetchMode);
    }

//CHIAMATA
      $result = $this->db->select('SELECT "utName" FROM base.utenti WHERE "utUsername" = :utUsername', array(':utUsername' => Session::get('user')));
Opzione 2 più consisa

Codice: Seleziona tutto

public function select2($sql, $array = array(), $fetchMode = PDO::FETCH_ASSOC) {
        $sth = $this->prepare($sql);
        $sth->execute($array) or die(print_r($sth->errorInfo(),true));

        return $sth->fetchAll($fetchMode);
    }

//CHIAMATA
        $result = $this->db->select2('SELECT * FROM base.utenti WHERE "utUsername" = ?', array(Session::get('user')));
Ultima modifica di Xeyos il giovedì 27 agosto 2015, 7:51, modificato 1 volta in totale.
TommyB1992
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 857
Iscrizione: domenica 7 luglio 2013, 15:55
Desktop: GNU/Linux
Distribuzione: Ubuntu 22.04.2 LTS
Sesso: Maschile

Re: [PHP] Dubbio PDO

Messaggio da TommyB1992 »

teoricamente la prima visto che utilizzi il metodo bindValue, praticamente immagino sia indifferente se Session::get('user') è controllata.
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: [PHP] Dubbio PDO

Messaggio da Zoff »

Sono ugualmente sicure. Entrambe usano i prepared statement e trattano gli argomenti come PDO:PARAM_STR.
Documentazione di bindValue() ha scritto: Descrizione

Codice: Seleziona tutto

public bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
Binds a value to a corresponding named or question mark placeholder in the SQL statement that was used to prepare the statement.
Come si vede il valore predefinito di $data_type è PDO::PARAM_STR
Documentazione di execute() ha scritto: Elenco dei parametri

input_parameters

An array of values with as many elements as there are bound parameters in the SQL statement being executed. All values are treated as PDO::PARAM_STR.
Come si vede anche quì gli argomenti sono trattati come PDO::PARAM_STR.

@TommyB1992: Secondo quale "teoria" la prima dovrebbe essere piu' sicura? L'unica differenza è che nel primo si usano dei Named Prepared Statement perché i placeholder posseggono una label (nome), mentre nel secondo si usano Prepared Statement "tradizionali" o Positional ovvero i placeholder (rappresentati da punti interrogativi) vengono distinti esclusivamente dalla loro posizione.
Ritengo che quando non si conosce un argomento se si decide di fare comunque un tentativo perché, giustamente, si vuole aiutare un altro utente si dovrebbe, come minimo, specificare che non si è certi di quello che si scrive, dalla tua risposta sottintendi addirittura che ci sia una "teoria" a supporto della tua affermazione.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Xeyos
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 463
Iscrizione: lunedì 26 maggio 2008, 14:16

Re: [PHP] Dubbio PDO

Messaggio da Xeyos »

Zoff [url=http://forum.ubuntu-it.org/viewtopic.php?p=4796358#p4796358][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Sono ugualmente sicure. Entrambe usano i prepared statement e trattano gli argomenti come PDO:PARAM_STR.
Documentazione di bindValue() ha scritto: Descrizione

Codice: Seleziona tutto

public bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
Binds a value to a corresponding named or question mark placeholder in the SQL statement that was used to prepare the statement.
Come si vede il valore predefinito di $data_type è PDO::PARAM_STR
Documentazione di execute() ha scritto: Elenco dei parametri

input_parameters

An array of values with as many elements as there are bound parameters in the SQL statement being executed. All values are treated as PDO::PARAM_STR.
Come si vede anche quì gli argomenti sono trattati come PDO::PARAM_STR.

@TommyB1992: Secondo quale "teoria" la prima dovrebbe essere piu' sicura? L'unica differenza è che nel primo si usano dei Named Prepared Statement perché i placeholder posseggono una label (nome), mentre nel secondo si usano Prepared Statement "tradizionali" o Positional ovvero i placeholder (rappresentati da punti interrogativi) vengono distinti esclusivamente dalla loro posizione.
Ritengo che quando non si conosce un argomento se si decide di fare comunque un tentativo perché, giustamente, si vuole aiutare un altro utente si dovrebbe, come minimo, specificare che non si è certi di quello che si scrive, dalla tua risposta sottintendi addirittura che ci sia una "teoria" a supporto della tua affermazione.

Grazie Zoff, ottima spiegazione come sempre. Credo utilizzerò la seconda molto più spesso, almeno è più concisa...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 17 ospiti