2009-09-05 10 views
5

Ich habe das Internet nach einem guten Beispiel durchforstet, aber ich kann nichts finden.Wie mache ich eine geeignete Mysqli-Erweiterungsklasse mit vorbereiteten Anweisungen?

Ich versuche, die mysqli-Klasse zu erweitern, um eine Hilfsklasse zu bilden, die einige der Komplexitäten abstrahieren wird. Eines der wichtigsten Dinge, die ich erreichen möchte, ist die Verwendung von vorbereiteten Aussagen.

Ich weiß nicht wirklich wo ich anfangen soll, oder wie man Eingabe und Ausgabe in einer Klasse richtig behandelt. Ein weiteres Problem ist, dass ich Daten nicht als ein Array ausgeben kann, während vorbereitete Anweisungen verwendet werden.

Ich könnte wirklich ein einfaches Beispiel verwenden, um mir in die richtige Richtung zu zeigen.

Danke!

Antwort

5

Überprüfen Sie die Implementierung von Zend_Db und insbesondere Zend_Db_Select. In der Tat, könnten Sie einfach entscheiden, das zu verwenden, anstatt Ihr eigenes zu entwickeln. Beispiele:

//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

Ich hatte gehofft, meine eigenen zu machen, aber ich bin nicht sicher. Funktioniert '$ db-> fetchAll ($ sql, 2);' wie mysql_fetch_array? Warum scheint es auch so viel redundanten Code zu geben, der in jedem Skript existieren muss? Kann ich eine andere Klasse bilden, die alles bis zum Ende dieses Versuches erledigt, eine Aussage einholt oder ist das eine schlechte Übung? –

+0

@Jon - FetchAll wird standardmäßig ein assoziatives Array zurückgeben (kann geändert werden, es gibt auch fetchRow, fetchCol, fetchOne und so weiter). Der lange try..catch wird idealerweise nur einmal in Ihrer Anwendung innerhalb des Bootstraps (oder eines Includes oder dergleichen) erscheinen, also ist das nicht wirklich ein Problem. – karim79

+0

Ok, das sieht so aus, als würde ich gehen. Danke für deine Hilfe! –

0

Schauen Sie sich Zend Framework und es ist absolut modular Zend_Db Klasse, vor allem die mysqli Adapter.

0

Angenommen, Sie wollen eigentlich Ihre eigene Version schreiben (im Gegensatz zu einem der vorhandenen Bibliotheken verwendet andere Antworten haben vorgeschlagen - und das sind gute Möglichkeiten, auch ...)

Hier sind ein paar Funktionen, die Sie möglicherweise nützlich finden, zu untersuchen. Mit der ersten Option können Sie die Ergebnisse einer Abfrage an ein assoziatives Array binden, mit der zweiten können Sie zwei Arrays übergeben, eine für ein geordnetes Array von Schlüsseln und die andere für ein assoziatives Datenfeld für diese Schlüssel, an das die Daten gebunden werden eine vorbereitete Erklärung:

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

ich habe eine Wrapper-Klasse geschrieben, dies zu tun - es bietet eine identische Schnittstelle für parametrisierte Abfragen mit entweder MySQLi oder PDO. Die Schnittstelle ermöglicht es Ihnen, parametrisiertes SQL in einer einzigen Codezeile auszuführen, was Ihren eigenen Code erheblich vereinfacht.

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

Verwandte Themen