2016-08-30 7 views
0

Ich entschied mich, von mysqli/mysqlnd zu PDO zu wechseln, aber ich stoße auf ein Problem, das ich das letzte Mal hatte, als ich das tat. Ich versuche das noch einmal, da es scheint, dass PDO angeblich unterstützt, eine Variable zu übergeben, die ein Array von Werten an den execute() Parameter für das Binden an die Abfrage enthält, ohne Dinge wie call_user_func_array zu verwenden.PDO-Ergebnisse sind leer

Der Code, den ich für die Demonstration haben, ist:

$bind_arguments[] = "dogs"; 
$bind_arguments[] = "cats"; 
$bind_arguments[] = "birds"; 

$db = new PDO('mysql:dbname=' . SQL_DATA . ';host=' . SQL_SERVER, SQL_USERNAME, SQL_PASSWORD, array (
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
)); 

$sql = 'SELECT `name` FROM `pets` WHERE `type` = ? OR `type` = ? OR `type` = ?'; 

$result = Array(); 
try { 

    if($stmt = $db->prepare($sql)) { 

     $stmt->execute($bind_arguments); 
     $result = $stmt->fetchAll(); 


    } 
} catch(PDOException $e) { 
    echo 'Wrong SQL: ' . $sql . ' Error: ' . $e->getMessage(); exit; 
} 

$db = null; 

var_export($result); // null 

Ich bekomme keine Ausnahmen, aber $result null ist. Wenn ich die normale Abfrage mit Navicat (oder mit mysqli) mache, funktioniert es!

Siehe Example #5, was zeigt, ich sollte in der Lage (Referenz von dort hier veröffentlichen Beispiel) dies zu tun:

<?php 
/* Execute a prepared statement using an array of values for an IN clause */ 
$params = array(1, 21, 63, 171); 
/* Create a string for the parameter placeholders filled to the number of params */ 
$place_holders = implode(',', array_fill(0, count($params), '?')); 

/* 
    This prepares the statement with enough unnamed placeholders for every value 
    in our $params array. The values of the $params array are then bound to the 
    placeholders in the prepared statement when the statement is executed. 
    This is not the same thing as using PDOStatement::bindParam() since this 
    requires a reference to the variable. PDOStatement::execute() only binds 
    by value instead. 
*/ 
$sth = $dbh->prepare("SELECT id, name FROM contacts WHERE id IN ($place_holders)"); 
$sth->execute($params); 
?> 

Auch Example #1 sehen Einfachheit halber geschrieben unter:

<?php 
$sth = $dbh->prepare("SELECT name, colour FROM fruit"); 
$sth->execute(); 

/* Fetch all of the remaining rows in the result set */ 
print("Fetch all of the remaining rows in the result set:\n"); 
$result = $sth->fetchAll(); 
print_r($result); 
?> 

Warum Funktioniert das nicht? Was mache ich falsch ?

aktualisieren

ich einige Fehler gemacht, wenn mein Code veröffentlichen (die aus einer größeren Klasse gestrippt wurde) für StackOverflow's MVCE Anforderungen. Diese Tippfehler waren in der ursprünglichen Klasse nicht vorhanden. Ich habe sie im obigen Code aktualisiert. - Entschuldigung für die mögliche Verwirrung.

+1

In dem ersten Code-Snippet, das Sie veröffentlicht haben, verwendeten Sie $ db = new PDO ... 'aber in der Try/Catch-Block verwenden Sie' $ this -> _ db- > vorbereiten'. Ist das dein echter Code oder? Warum würden Sie auch '$ db = null' verwenden? Das wird jeden Punkt der Leistung komplett zunichte machen, da in FCGI-Anwendungen, die Sie persistent Verbindungen haben wollen, um tcp Handshake und Überprüfung der Anmeldeinformationen bei jeder Anfrage zu vermeiden. – Mjh

+0

@Mjh - gutes Auge, sorry, ich habe es aus einer Klasse für [MVCE] (http://stackoverflow.com/help/mcve) geerntet. Im aktuellen Projekt ist '$ this -> _ db' das Objekt. Update Sample über –

+0

an einem gewissen Punkt hatte ich ein ähnliches Phänomen und begann mit bindValue, um die Werte festzulegen und ohne Params ausführen. ; o ( – Jakumi

Antwort

1

Sie weisen $bind_array und $bnid_array Werte zu, senden jedoch $bind_arguments an execute(). Versuchen Sie die $bnid_array und $stmt->execute($bind_array);

+0

nur ein Tippfehler beim Strippen für [MVCE] (http://StackOverflow.com/Help/Mcve) jetzt korrigieren. Problem ist nicht relevant für die. –

+0

Wenn dies das Problem wäre, hätte dies beim Versuch, eine Nullvariable auszuführen, eine PDOException verursacht. –