Visualizzazione dei risultati da 1 a 6 su 6

Discussione: bind_param dinamico

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    40

    bind_param dinamico

    Salve a tutti...

    Faccio presente che prima di postare qui ho fatto una ricerca in generale su internet ma non sono riusicto a trovare gran chè, salvo questo link. Il problema è che non riesco bene i passi che l'utente ha seguito per risolvere il problema (il link è http://www.daniweb.com/forums/thread96230.html).

    Il problema è il seguente: sto cercando di costruire da me una specie di framework e sono arrivato alla parte di collegamento al db. Vorrei che l'utilizzo delle funzioni di interrogazione e settaggio dei parametri rimanesse nascosto in fase di programmazione e che il tutto fosse eseguito dal framework.
    Avevo risolto NONutilizzando mysqli, ma poi mi sono reso conto che la funzione di bind_param è decisamente più sicura e soprattutto più veloce in fase di esecuzione poichè è meglio sfruttata la cache del db.
    Ora al di là di tutto, vorrei che in fase di programmazione si mettessero dentro un array dei parametri che poi vengano passati come argomento, insieme alla query, alla funzione del framework che deve eseguire la query.
    Ora in java sarebbe tuttp facile (sono 6 anni che lavoro nel campo), in php5 un po' meno visto che sto imparando tutto amatorialmente.

    Il problema del bind_param è che non si può definire l'indice in cui si sta settando il parametro (dove c'è il punto interrogativo), ma vuole in ordine tanti parametri quanti sono i punti interrogativi e mi sembra di aver capito che non vuole nemmeno il valore contenuto nei parametri, ma vuole variabili.
    Mi spiego meglio...se devo passare due parametri "param1" e "param2" non potrei semplicemente fare $stmt->bind_param('ss,'param2','param2'); perchè va in errore.
    Ora vi posto come avevo pensato di risolvere, ma che non capisco perchè non funziona.

    <?php

    $sqlQuery = "SELECT campo1, campo2 FROM tabella Where a=? AND b=?";

    $params[0] = 'pluto';
    $params[0] = 'paperino';

    executeQuery($sqlQuery, $params);

    function executeQuery($sqlQuery, $params)
    {
    try {

    $count = 1;
    $countColonna = 0;
    $bindResultparams = '';

    $stmt = $this->mysqli->stmt_init();
    $stmt->prepare($sqlQuery);
    $numParams = '';
    $typeParams = '';


    for ($i = 0; $i<count($params); $i++) {
    $typeParams .= 's';
    $numParams .= "'".$params[$i]."'";

    if ($i != count($params)-1)
    $numParams .= ',';
    }

    $func = "bind_param('$typeParams',$numParams)";
    $stmt->$func;

    $stmt->execute();

    $stmt->store_result();

    printf("Number of rows: %d.\n", $stmt->num_rows);

    ?>

    La printf mi restituisce 0 invece dovrebbe darmi un numero positivo!

    Come posso risolvere secondo voi?

  2. #2
    Non ho mai usato bind_param(), ma ti posso evidenziare le imprecisioni che saltano all'occhio:

    Codice PHP:
    <?php

    $sqlQuery 
    "SELECT campo1, campo2 FROM tabella Where a=? AND b=?";

    /* $params[0] = 'pluto';
     * $params[0] = 'paperino';
     * Non va bene: non generi un vettore di due elementi ma
     * assegni due volte al primo elemento */
    $params[] = 'pluto';
    $params[] = 'paperino';

    executeQuery($sqlQuery$params);

    function 
    executeQuery($sqlQuery$params)
    {
    /* try {
     * Senza il corrispettivo catch non va */

    /* $count = 1;
     * $countColonna = 0;
     * $bindResultparams = '';
     * Non più usati */

    $stmt $this->mysqli->stmt_init();
    $stmt->prepare($sqlQuery);

    /* Questo non va bene: passi a bind_param() una stringa con
     * valori separati da virgola, non argomenti diversi (come invece richiede)
     * $numParams = '';
     * $typeParams = '';
     * for ($i = 0; $i<count($params); $i++) {
     * $typeParams .= 's';
     * $numParams .= "'".$params[$i]."'";
     * if ($i != count($params)-1)
     * $numParams .= ',';
     * }
     * $func = "bind_param('$typeParams',$numParams)";
     * $stmt->$func; */
    $types '';
    foreach (
    $params as $param) {
      if (
    is_string($param)) {
        
    $types .= 's';
      } elseif (
    is_int($param)) {
        
    $types .= 'i';
      } elseif (
    is_double($param)) {
        
    $types .= 'd';
      } else {
        return 
    false;
      }
    }
    array_unshift($params$types);
    call_user_func_array(array(&$stmt'bind_param'), $params);

    $stmt->execute();

    $stmt->store_result();

    printf("Number of rows: %d.\n"$stmt->num_rows);

    /* Manca la chiusura della funzione */
    }

    ?>
    Comunque, fossi in te, darei un'occhiata alle funzioni PDO (le trovi direttamente nel manuale PHP): sono molto simili a mysqli ma astraggono anche dal database server. Se devi cominciare da zero, tanto vale farlo alla grande.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    40
    Ntd, darò un'occhiata a PDO, grazie!
    per quanto riguarda le imprecisioni che mi hai fatto notare effettivamente hai ragione, ma sono date da distrazione quando ho fatto il copi-incolla del codice ed ho dovuto cambiare alcune cose...spero che comunque il succo del mio problema si possa capire ugualmente...

    Grazie...ciao ciao!

  4. #4
    Il succo si capiva e, anzi, è raro trovare un tentativo di ricerca qualitativa a questi livelli nel PHP. L'unico errore di concetto era proprio la chiamata a "bind_param" (le altre erano imprecisioni) e questo problema te lo ritroverai anche nel PDO, se decidi di usarlo. Tienilo presente.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    40
    Ntd, ho applciato al porzione di codice per il bindparam che mi hai corretto tu e funziona, grazie mille!!! Ora il problema è un altro credo molto più semplice (scuste, sto imparando)!

    Continuo dall'array_unshift


    Codice PHP:
    array_unshift($params$types);
    call_user_func_array(array(&$stmt'bind_param'), $params);

            
    $stmt->execute();

            
    $stmt->store_result();

        
    printf("Number of rows: %d.\n"$stmt->num_rows);

    $stmt->fetch();

            while(
    $stmt->fetch())
            {print(
    "Nel ciclo");
               
    printf("[b]%d[/b]<span>%s</span>
    "
    $bindResultparams);
            } 
    Ecco...il problema è che non mi entra nel ciclo del fetch, quindi non stampa "Nel ciclo". A che è dovuto? Che errore commetto?

  6. #6
    Originariamente inviato da zat81
    Ecco...il problema è che non mi entra nel ciclo del fetch, quindi non stampa "Nel ciclo". A che è dovuto? Che errore commetto?
    Commetti due errori: il primo è $stmt->fetch(); prima del while (inutile e che ti "consuma" una riga dal risultato), il secondo, ben più grave, non esegui il binding dell risultato. Controlla la documentazione di mysqli_stmt_bind_result(): ti fornisce anche degli esempi.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.