php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2010

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.05.2010, 15:44  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.733
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Sorry, mir erschließt sich das aktuelle Probleme nicht so richtig und ich bin gerade nicht in der Stimmung, den gesamten Thread nachvollziehen zu wollen. Aber ich habe neulich in einem anderen Kontext mal das hier gebastelt:

PHP-Code:
<?php

class Test
{
    protected 
$_mysqli_stmt;
    protected 
$_mysqli;

    public function 
__construct($server$user$password$db)
    {
        
$this->_mysqli = new mysqli($server$user$password);
        
$this->_mysqli->select_db($db);
        
$this->_mysqli_stmt $this->_mysqli->stmt_init();
    }

    
/**
     *
     * @see http://www.php.net/manual/en/mysqli-stmt.bind-param.php#96770
     */
    
protected function _refValues($arr){
        if (
strnatcmp(phpversion(),'5.3') >= 0//Reference is required for PHP 5.3+
        
{
            
$refs = array();
            foreach(
$arr as $key => $value)
                
$refs[$key] = &$arr[$key];
            return 
$refs;
        }
        return 
$arr;
    } 

    public function 
insert($table$data)
    {
        
$sql 'INSERT INTO `' $this->_mysqli->escape_string($table) . '`';

        
// Feldnamen hinzufügen
        
$escapedKeys array_map(array($this->_mysqli'escape_string'), array_keys($data));
        
$sql .= ' (`' implode('`, `'$escapedKeys) . '`)';
     
        
// Platzhalter für Werte hinzufügen
        
$sql .= ' VALUES (' implode(', 'array_fill(0count($data), '?')) . ')';

        
// Feldtypen ermitteln
        
$type '';
        
$values array_values($data);

        foreach (
$values as $value) {
            if (
is_int($value)) {
                
$type .= 'i';
            } else if (
is_double($value)) {
                
$type .= 'd';
            } else {
                
$type .= 's';
            }
        }

        if (!(
$this->_mysqli_stmt->prepare($sql))) {
            return 
FALSE;
        }

        if (!
call_user_func_array(array($this->_mysqli_stmt"bind_param"),
            
array_merge(array($type), $this->_refValues($data)))
        ) {            
            return 
FALSE;
        }

        if (!(
$this->_mysqli_stmt->execute())) {
            return 
FALSE;
        }
        
        if ((
$this->_mysqli_stmt->affected_rows) <= 0) {
            return 
FALSE;
        }
        
        return 
TRUE;
    }
}

$t = new Test('localhost''user''pass''dbname');

$data = array(
    
'headline'  => 'db-test',
    
'text'      => 'eins, zwei, drei, vier',
    
'author_id' => 12
);

$f $t->insert('news'$data);

if (
$f == false) {
    echo 
'Fehler';
} else {
    echo 
'Erfolg';
}
Vielleicht hilft es ja. (Bitte keine Kommentare über den Sinngehalt des Codes. Ich weiß, dass der fast völlig zweckfrei ist. )

Edit: Zusammengefasst: Es gibt da an einer Stelle ein abweichendes Verhalten ab PHP 5.3 (siehe verlinkter Post). Benutzt du PHP 5.3?
__________________
Blog | Buch | Kaloa
mermshaus ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.05.2010, 00:40  
Neuer Benutzer
 
Registriert seit: 21.01.2010
Beiträge: 23
PHP-Kenntnisse:
Anfänger
Ballamann befindet sich auf einem aufstrebenden Ast
Standard

Danke mermshaus!

Durch deinen Beitrag hab ich wieder ein wenig google gequält und bin schließlich auf diese Seite hier gestoßen: klick

Des Rätsels Lösung besteht darin von meinem Array $params[] eine Kopie mit Referenzen auf dieses Array zu erstellen. Danach kann ich wie gewünscht $params verändern und es funktioniert. Dickes Danke!
Ballamann ist offline  
Alt 18.05.2011, 19:48  
Benutzer
 
Registriert seit: 16.07.2010
Beiträge: 80
PHP-Kenntnisse:
Fortgeschritten
SinnlosS befindet sich auf einem aufstrebenden Ast
Standard

Ich weiß, das der Thread älter ist. Da aber scheinbar häufiger Leute vor diesem Problem stehen (Aufruf von bind_param mit unbekannter Anzahl Parameter), und ich kürzlich ebenfalls, hier noch eine Alternative zu dem Workaround für PHP 5.3+ (setzen der Referenzen für die Array-Elemente in einer eigenen Funktion).
Durch Nutzung von Reflection spart man sich die Zusatzfunktion und wird in der Performance etwas schneller, allerdings hat man für bind_param zwei Zeilen Code mehr:
PHP-Code:
$db     = new mysqli("localhost","root","","tests"); 
$res    $db->prepare("INSERT INTO test SET test2=?,test3=?"); 
$refArr = array("si","hallo",1); 
$ref    = new ReflectionClass('mysqli_stmt'); 
$method $ref->getMethod("bind_param"); 
$method->invokeArgs($res,$refArr); 
$res->execute(); 
Und noch ein Hinweis der zwar generell bind_param() betrifft, bei der hier angesprochenen Problemstellung aber immer auftritt: Vorsicht beim binden von Array-Elementen wenn das Statement mehrmals mit wechselnden Values durchgeführt werden soll!
Die Array-Values müssen EXPLIZIT ihrem jeweiligen Key zugewiesen werden. Eine Neugenerierung des kompletten Arrays zerstört die Referenzen, auch bei identischen Keys.

Beispiele:
PHP-Code:
$db     = new mysqli("localhost","root","","tests"); 
$res    $db->prepare("INSERT INTO test SET test2=?,test3=?"); 
$refArr = array("si","hallo",1); 
$ref    = new ReflectionClass('mysqli_stmt'); 
$method $ref->getMethod("bind_param"); 
$method->invokeArgs($res,$refArr); 
$res->execute(); 
$refArr = array("si","ciao",2);
$res->execute();
// Trägt zweimal die Values "hallo" und 1 ein


$db     = new mysqli("localhost","root","","tests"); 
$res    $db->prepare("INSERT INTO test SET test2=?,test3=?"); 
$refArr = array(0=>"si",1=>"hallo",2=>1); 
$ref    = new ReflectionClass('mysqli_stmt'); 
$method $ref->getMethod("bind_param"); 
$method->invokeArgs($res,$refArr); 
$res->execute(); 
$refArr = array(0=>"si",1=>"ciao",2=>2);
$res->execute();
//  Trägt zweimal die Values "hallo" und 1 ein


$db     = new mysqli("localhost","root","","tests"); 
$res    $db->prepare("INSERT INTO test SET test2=?,test3=?"); 
$refArr = array(0=>"si",1=>"hallo",2=>1); 
$ref    = new ReflectionClass('mysqli_stmt'); 
$method $ref->getMethod("bind_param"); 
$method->invokeArgs($res,$refArr); 
$res->execute(); 
$refArr[1] = "ciao";
$refArr[2] = 2;
$res->execute();
// Trägt wie gewünscht beim ersten execute() "hallo" und 1 ein, beim zweiten execute() "ciao" und 2 
SinnlosS ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem mit Ajax - Session Problem halskrause PHP Tipps 2009 10 12.01.2010 02:27
[Erledigt] Problem mit Mehrsprachigkeit Sniper_Kotaro PHP Tipps 2009 2 16.12.2009 11:47
Problem beim Download Management mistermint PHP Tipps 2009 8 24.10.2009 11:34
Umlaut Problem nokieone PHP Tipps 2009 7 16.10.2009 19:30
Problem mit Basedir in PhP cmuch05 Datenbanken 9 08.01.2009 14:17
[Erledigt] Problem: PHP Selbe Datei mehr als 1 Mal soulan PHP Tipps 2008 13 28.11.2008 22:51
Problem Upload mehrere Dateien und schreiben in DB Lapje PHP Tipps 2008 1 22.10.2008 13:12
utf8 Problem (Daten aus DB auslesen) go1denboy PHP Tipps 2008 1 23.09.2008 12:19
Problem mit swfobjects R4v3r JavaScript, Ajax und mehr 8 21.09.2008 14:17
[Erledigt] Galerie Problem... coraplanet PHP Tipps 2008 4 06.06.2008 13:42
datensätze defekt oder problem mit dem einlesen? Ministry Datenbanken 4 06.07.2006 18:42
problem!!! PHP Tipps 2006 6 08.02.2006 11:06
Smarty und PHP-Skript Problem PHP Tipps 2004-2 2 03.12.2004 22:27
Problem mit alter JavaScript-Funktion woods PHP Tipps 2004 1 13.08.2004 13:34

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
call_user_func_array bind_param, bind_param array, php bind_param, mysqli bind_param array, php bind_param array, php 5.3 bind_param call_user_func_array, call_user_func_array alternative, php bind param, call_user_func_array mysqli, $refs[$key] = &$arr[$key];, php bind_param in array, bind_param call_user_func_array, php bind_param call_user_func_array, call_user_func_array key 0, \new reflectionclass\ problem, php bind_param mehrer zeilen, bindparam call_user_func_array, problem with bind param ? insert into, getmethod(\bind_param, \bind_param\ call_user_func_array

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:02 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum