Visualizzazione risultati 1 fino 2 di 2

Discussione: Trasformare query mysql in pdo

  1. #1
    niko74b non è connesso Neofita
    Data registrazione
    23-03-2021
    Messaggi
    1

    Predefinito Trasformare query mysql in pdo

    Salve a tutti
    Avrei questo quesito da porvi:
    Partendo dalla mia connessione al database mysql nel file config.php:
    Codice PHP:
    $dsn = 'mysql:dbname=my_db;host=localhost';
    $user = 'root';
    $pass = '';
    $charset = 'utf8mb4';

    try
    {
    $pdo = new PDO($dsn,$user,$pass,$charset);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    catch(
    PDOException $e){
    // otteniamo l'errore
    echo 'Error: ' . $e->getMessage();
    echo
    'Line: ' . $e->getLine();
    echo
    'File: ' . $e->getFile();
    }

    //Funzione lista bianca che mi servirà successivamente per ordinare le query select

    function white_list(&$value, $allowed, $message) {
    if (
    $value === null) {
    return
    $allowed[0];
    }
    $key = array_search($value, $allowed, true);
    if (
    $key === false) {
    throw new
    InvalidArgumentException($message);
    } else {
    return
    $value;
    }
    }
    Vorrei capire se la connessione cosi impostata è fatta bene e credo sia cosi visto che richiamando il file config.php non mi risulta alcun errore.
    A questo punto iniziano i miei grattacapi perchè dovrei modificare questa query :
    Codice PHP:
    $slide_query = "SELECT * FROM pictures ORDER BY position ASC";
    $slide_result = mysqli_query($slide_query);
    while(
    $slide_sql = mysqli_fetch_array($slide_result))
    reimpostandola con utilizzo delle pdo.
    Da quanto ho letto con le pdo la query SELECT * FROM pictures ORDER BY position ASC presenta qualche inconveniente perchè, a differenza di mysqli , non si può ordinare "in maniera generica" ma bisogna impostare delle variabile opportune ed implementare una white_function nel file config.php
    Codice PHP:
    $orderby = white_list($_GET['orderby'], ["position"], "Invalid field name");
    $direction = white_list($_GET['direction'], ["ASC","DESC"], "Invalid ORDER BY direction");
    $slide_query=$pdo->prepare("SELECT * FROM pictures WHERE column = :position ORDER BY ".$order ." ".$direction");
    $slide_query->bindParam(':my_param', $is_live, PDO::PARAM_STR);
    if (
    $slide_query->execute($_POST[‘position’])); {
    while(
    $slide_sql = $slide_query->fetch_all(PDO::FETCH_ASSOC));
    }
    Qualche buon anima che mi possa aiutare a capire...?

  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,896

    Predefinito

    Come risposto in altro forum la white_list (lista bianca) è utile per confrontare tra uno o più valori consentiti.
    Se non esiste $_GET['orderby'] di predefinito php assegna il valore NULL, che per la tua funzione white_list se NULL === null restituisci il predefinito (l'array con chiave 0, il secondo argomento della funzione white_list). Altrimenti se uguale e dello stesso tipo della lista bianca usa per referenza della variabile esterna (in questo esempio $_GET['orderby']).

    Poiché secondo il mio parere white_list non è una funzione funzionale preferisco lavorare in modo grezzo (con stile procedurale)
    Codice PHP:
    <?php
    error_reporting
    (-1);
    $_GET = array('orderby' => 'position');

    $allowed_list = array('position');
    $check_error = null;
    unset(
    $check_error);
    if(isset(
    $_POST['orderby'], $_GET['orderby']))
    $debug[0] = 'non entrambi $_POST[\'orderby\'] e $_GET[\'orderby\']';
    elseif(!(!empty(
    $_GET['orderby']) && is_string($_GET['orderby']) && strlen($_GET['orderby']) === strlen('position') && 'position' === $_GET['orderby'])) {
    $orderby = 'position'; //esplicito ma direttamente implicito per la query poiché esiste unicamente questo valore e non diverso
    $debug[0] = 'non corrisponde con position o addirittura $_GET[\'orderby\'] assente';
    }
    else {
    $orderby = 'position'; //esplicito ma direttamente implicito per la query poiché esiste unicamente questo valore e non diverso
    $check_error = true;
    }

    if(!empty(
    $debug))
    echo
    $debug[0];
    elseif(isset(
    $check_error))
    echo
    'stringa position senza ripetizione accettata';
    else
    echo
    'non sta funzionando come previsto'; //l'imprevisto per un motivo noto o meno

    //Elimino le variabili se non mi servono e ripristino la memoria per php
    $allowed_list = null;
    $debug = null;
    $check_error = null;
    unset(
    $allowed_list, $debug, $check_error);
    PS. codice adattato proprio per un singolo valore di $allowed_list, quindi evito di usare array_search della tua funzione white_list:
    Codice PHP:
    function white_list(&$value, $allowed, $message) {
    if (
    $value === null) {
    return
    $allowed[0];
    }
    $key = array_search($value, $allowed, true);
    if (
    $key === false) {
    throw new
    InvalidArgumentException($message);
    } else {
    return
    $value;
    }
    }
    Se guardi bene confronto il valore della variabile esterna ma la variabile $orderby è impostata come il mio codice stringa (cioè non è possibile una SQL Injection, poiché "position" non fa parte né di parole riservate o sintassi particolare per MYSQL).
    I Preparated Statement sanitizzano/filtrano i dati.
    Attenzione PDO: su altervista l'impostazione utf8mb4 non funziona né tramite costruttore che tramite opzione, purtroppo con SET NAMES fonte pdo::quote https://bugs.php.net/bug.php?id=47802
    Ciò dovrebbe tuttavia essere chiarito nella documentazione: l'esecuzione di SET NAMES non dice nulla alla libreria client (libmysql/mysqlnd utilizzata da PHP) quindi non possono eseguire la codifica corretta. Pertanto solo Latin 1, UTF-8 e altre codifiche che utilizzano 7 bit inferiori in modo compatibile con ASCII possono essere utilizzate in sicurezza. Per altre codifiche dovrebbe essere usata l'opzione menzionata, introdotta più avanti in 5.3.6.
    e sei forse (se non usi un sottoinsieme di 7 bit inferiori compatibile con ASCII, per il cliente e MYSQL) vulnerabile poiché i Preparated Statement lavorano per altro charset (giustamente A in latin1 o A in UTF-8 senza BOM usano esattamente lo stesso ordine di byte, ma se confronto È in latin-1 è un byte mentre È in UTF-8 è due bytes). Rimani con mysqli e imposta la connessione tramite mysqli_set_charset se non sei un programmatore esperto. Altrimenti usa la codifica core (api per il database) qui di WordPress che prevede tali casi.
    Ultima modifica di darbula : 18-12-2021 alle ore 15.24.11

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •