2014-01-15 3 views
5

Ich stoße meinen Kopf gegen eine Wand, weil die Art, wie ich Dinge in Perl zu tun, funktioniert nicht in PHP. Dies ist wahrscheinlich etwas so grundlegendes, dass ich nicht weiß, wie ich die Frage richtig stellen soll. Der Crux: Ich bin es gewohnt, ein Array im Listenkontext als Argument für eine Funktion in Perl zu senden, aber in PHP gebe ich nur einen Verweis auf das Array weiter.Willst du eine Liste von Werten in PHP übergeben (wie in Perl), nicht Bezug auf Array

Ich versuche, eine grundlegende SQL-Abfrage in PHP mit MySQLi, zum Beispiel SELECT * FROM my_table WHERE first_name = 'Bob' AND last_name = 'Smith' AND city = 'Akron'. Der Trick ist, mein Code weiß nicht im Voraus, welche Begriffe in der Abfrage enthalten sein werden. Die Abfrage wird spontan erstellt, abhängig davon, welche Suchbegriffe der Benutzer verwenden möchte. In Perl ist das einfach. In PHP bin ich mir nicht sicher, was ich tun soll. Anders gefragt: Wie kann ich dynamisch eine Werteliste in PHP bilden und übergeben?

Was ich zu tun in Perl gewohnt bin:

my %terms = (
    'first_name' => 'Bob', 
    'last_name' => 'Smith', 
    'city' => 'Akron' 
); 

my @keys = keys %terms; 
my $where_string = join(' AND ', map("$_ = ?", @keys)); 
my @values = @terms{@keys}; 

my $sql = "SELECT * FROM my_table WHERE $where_string"; 
# Should give me 'SELECT * FROM my_table WHERE first_name = ? AND last_name = ? AND city = ?' 
my $sth = $dbh->prepare($sql); 
$sth->execute(@values); 

Was ich versuche in PHP zu tun, das nicht funktioniert:

foreach ($terms as $key => $value) { 
    $keys[] = "$key = ?"; 
    $values[] = $value; 
    $types .= (is_numeric($value) ? "i" : "s"); 
} 
$where_string = implode(' AND ', $keys); 
$sql = "SELECT * FROM my_table WHERE $where_string"; 
$sth = $dbh->prepare($sql); 
$sth->bind_param($types, $values); # Only I need to pass @values, 
            # the list of the elements of the array, 
            # not a reference to the array 
$result = $sth->execute(); 

Es könnte mein Gehirn ist so Perl-süchtig, dass ich den gesunden Menschenverstand vergessen habe.

+0

immer wanderte, warum mysqli Typen benötigt, während DBD :: mysql ohne sie leben kann. –

+0

Ich auch. Diese ganze Tortur lässt mich wissen, warum ich überhaupt PHP benutze. (Antwort: Damit ich weiß, wie.) – LonelyPilgrim

+0

Ich hoffe, Ihnen ist bewusst, dass Ihr Code anfällig für SQL-Injection ist und nicht so performant wie möglich. Sie können beides beheben, indem Sie Platzhalter verwenden und die auszuführenden Variablen übergeben. –

Antwort

5

Was möchten Sie wahrscheinlich ist call_user_func_array():

$args = array_merge(array($types), $refs_to_values); 
call_user_func_array(array($sth, 'bind_param'), $args); 

Ja, es ist eine Art von hässlich; Manchmal ist die Flexibilität von Perl ein Vorteil.

+0

vielleicht Unterklasse mysqli, um Hässlichkeit zu verbergen. –

+0

Danke! Das hat mich schließlich dorthin gebracht. Es brauchte ein wenig mehr Optimierungen, da mysqli_stmt :: bind_param sehr spezifisch einen Wert und dann eine Reihe von Referenzen erwartet. Dies hat funktioniert: – LonelyPilgrim

+0

$ args [] = $ types; für ($ i = 0; $ i LonelyPilgrim

Verwandte Themen