2009-09-05 11 views
5

Ho setacciato il web per un buon esempio ma non riesco a trovare nulla.Come creare una vera classe di estensione mysqli con istruzioni preparate?

Sto cercando di estendere la classe mysqli per creare una classe di supporto che elimini alcune delle complessità. Una delle cose principali che voglio realizzare è fare uso di dichiarazioni preparate.

Non so davvero da dove iniziare o come gestire correttamente input e output in una classe. Un altro problema è che non riesco a produrre i dati come array durante l'utilizzo di istruzioni preparate.

Potrei davvero usare un semplice esempio per indicarmi la giusta direzione.

Grazie!

risposta

5

Verificare l'implementazione di Zend_Db e, in particolare, Zend_Db_Select. In realtà, potresti semplicemente scegliere di utilizzarlo invece di svilupparne uno tuo. Esempi:

//connect to a database using the mysqli adapter 
//for list of other supported adapters see 
//http://framework.zend.com/manual/en/zend.db.html#zend.db.adapter.adapter-notes 
$parameters = array(
        'host'  => 'xx.xxx.xxx.xxx', 
        'username' => 'test', 
        'password' => 'test', 
        'dbname' => 'test' 
        ); 
try { 
    $db = Zend_Db::factory('mysqli', $parameters); 
    $db->getConnection(); 
} catch (Zend_Db_Adapter_Exception $e) { 
    echo $e->getMessage(); 
    die('Could not connect to database.'); 
} catch (Zend_Exception $e) { 
    echo $e->getMessage(); 
    die('Could not connect to database.'); 
} 

//a prepared statement 
$sql = 'SELECT * FROM blah WHERE id = ?'; 
$result = $db->fetchAll($sql, 2); 

//example using Zend_Db_Select 
$select = $db->select() 
      ->from('blah') 
      ->where('id = ?',5); 
print_r($select->__toString()); 
$result = $db->fetchAll($select); 

//inserting a record 
$row = array('name' => 'foo', 
      'created' => time() 
      ); 
$db->insert('blah',$row); 
$lastInsertId = $db->lastInsertId(); 

//updating a row 
$data = array(
    'name'  => 'bar', 
    'updated' => time() 
); 

$rowsAffected = $db->update('blah', $data, 'id = 2');  
+0

speravo di fare il mio, ma non sono sicuro. '$ Db-> fetchAll ($ sql, 2);' si comporta come mysql_fetch_array? Inoltre, perché sembra che ci sia così tanto codice ridondante che deve esistere in ogni script? Posso fare un'altra lezione per gestire tutto fino alla fine di quel tentativo, prendere una dichiarazione o è considerata una cattiva pratica? –

+0

@Jon - fetchAll restituirà un array associativo per impostazione predefinita (può essere modificato, c'è anche fetchRow, fetchCol, fetchOne e così via). Il lungo try..catch apparirà idealmente solo una volta nella tua applicazione all'interno del bootstrap (o include o simili), quindi non è davvero un problema. – karim79

+0

Ok questo sembra il modo in cui andrò. Grazie per tutto il vostro aiuto! –

0

Scopri Zend Framework ed è una classe assolutamente modulare Zend_Db, in particolare l'adattatore mysqli.

0

Supponendo che si sta in realtà voler scrivere la propria versione (in contrapposizione ad utilizzare una delle librerie esistenti altre risposte hanno suggerito - e anche queste sono buone opzioni) ...

Ecco un paio di funzioni che potresti trovare utile esaminare. Il primo consente di associare i risultati di una query a un array associativo e il secondo consente di passare in due array, uno un array ordinato di chiavi e l'altro un array associativo di dati per tali chiavi e avere i dati vincolati in una dichiarazione preparata:

function stmt_bind_assoc (&$stmt, &$out) { 
    $data = mysqli_stmt_result_metadata($stmt); 
    $fields = array(); 
    $out = array(); 

    $fields[0] = $stmt; 
    $count = 1; 

    while($field = mysqli_fetch_field($data)) { 
     $fields[$count] = &$out[$field->name]; 
     $count++; 
    } 
    call_user_func_array(mysqli_stmt_bind_result, $fields); 
} 

function stmt_bind_params($stmt, $fields, $data) { 
    // Dynamically build up the arguments for bind_param 
    $paramstr = ''; 
    $params = array(); 
    foreach($fields as $key) 
    { 
     if(is_float($data[$key])) 
      $paramstr .= 'd'; 
     elseif(is_int($data[$key])) 
      $paramstr .= 'i'; 
     else 
      $paramstr .= 's'; 
     $params[] = $data[$key]; 
    } 
    array_unshift($params, $stmt, $paramstr); 
    // and then call bind_param with the proper arguments 
    call_user_func_array('mysqli_stmt_bind_param', $params); 
} 
0

ho scritto una classe wrapper per fare questo - fornisce un'interfaccia identica per le query parametrizzate sia con MySQLi o DOP. L'interfaccia consente di eseguire SQL parametrizzato in una singola riga di codice, che semplifica drasticamente il proprio codice.

http://www.robpoyntz.com/blog/?p=191

Problemi correlati