2016-05-03 15 views
1

ich eine gespeicherte Prozedur von PHPeine gespeicherte Prozedur von PHP-Aufruf

<?php 
include('global/db.php'); 
$id = 1; 
$base = conn(); 
$query = "CALL get_id(:id,@userid)"; 
$stmt = $base->prepare($query); 
$stmt->bindParam(':id',$id); 
$stmt->execute(); 
print_r($stmt->fetch()); 
?> 

die gespeicherte Prozedur wie diese

BEGIN 
SET @userid = (SELECT * FROM user WHERE user.id = id); 
SELECT @userid; 
END 

die Prozedur Parameter

IN id int(10), OUT userid VARCHAR(255) 

Fragen sieht Aufruf :

  • Warum gibt mein Ergebnis nichts zurück?
  • Welchen Datentyp muss meine Ausgangsvariable @userid haben?

Antwort

1

Ihre gespeicherte Prozedur weist einige Probleme auf.

Da Sie einen Ausgang haben userid warum dies @userid.

Sie auch ausgeben userid, so gibt es keine Notwendigkeit, SELECT es

Eine andere Sache ist, kann man nicht die gesamte Zeile in einer einzigen Variable auswählen, für mehrere Spalten sollten Sie mehrere Ausgangsvariablen verwenden.

BEGIN 
    SET userid = (SELECT column_name FROM user WHERE user.id = id); 
END 

aktualisieren

$result = $base->query("CALL get_id($id)"); 
while($data = $result->fetch_array(MYSQL_ASSOC)){ 
    echo $data['column_name']; 
} 
+0

ist gibt es trotzdem zum Beispiel 'SET somevariable =' um 'SELECT division FROM Benutzer WHERE division = blah' zu sagen, wo das Ergebnis mehrere' division1, division2, division3' aka skalare Werte 'array' zurückgeben würde –

+0

meinst du mehrere Zeilen (passend zu den Bedingung) ? – Sachin

+0

ja, genau das, was ich meine –

1

Derzeit Sie einen skalaren Parameter gesamte Abfrage Suchresultates durch Sternchen wie erwähnt definieren. Erwägen Sie die Verwendung INTO Klausel einer Abfrage Ergebniswert in den OUT Parameter zu übergeben:

DELIMITER $$ 
CREATE PROCEDURE get_id (
    IN id int(10), 
    OUT userid VARCHAR(255)) 
BEGIN 
    SELECT user.id 
    INTO userid 
    FROM user 
    WHERE user.id = id; 
END$$ 
DELIMITER ; 

Und in PHP, benötigen Sie eine zweite Abfrage ausführen, um die @userid Variable in einem Abrufbefehl zurück:

try { 
    include('global/db.php'); 
    $id = 1; 
    $base = conn(); 
    $query = "CALL get_id(:id,@userid)"; 
    $stmt = $base->prepare($query); 
    $stmt->bindParam(':id',$id); 
    $stmt->execute(); 

    $result = $base->query("SELECT @userid")->fetchAll(); 
    if ($result) { print_r($result); } 

} catch (PDOException $pe) { 
    echo $pe->getMessage()."\n";   
} 
+0

so im Grunde verwenden kann nicht '*' verwenden, da es ein 'Array' oder Skalarwert zurückgibt, die Sie nicht auf Variable setzen können? –

+0

Korrigieren, es sei denn, MySQL hat einen Array-/Vektortyp. Beachten Sie, dass Sie vollständige Abfrageergebnissätze zurückgeben können, ohne in eine OUT-Variable zu wechseln. – Parfait