PHP Stored procedures

derocco

Lt. Junior Grade
Registriert
Nov. 2015
Beiträge
337
versuche einen Code zu erweitern:

schreibt nach mysql via einem stored procedure
$IP = $_SERVER["REMOTE_ADDR"];
$DB->execute('call statistic_url(?)', array(addslashes($base)));


nun möchte ich das procedure erweitern in der DB um eine zusatz parameter (getan) (definiert als VARCHAR(64) kann auch schreiben via DB tool etc)

ich kriege aber nicht hin wie ich hier den 2. Parameter (IP ADRESSE) mitgebe. Egal was ich versuche es klappt nicht.

Echo von $IP geht aber die übergabe an das procedure da scheitere ich.

Any input?

Vielen Dank
 
https://pear.php.net/manual/en/package.database.db.db-common.execute.php

Note that execute() requires a handle to the statement returned by prepare(), not the statement itself.

Wenn ich deine 2 Zeilen richtig lese hast du genau das nicht getan, sondern direkt das Statement selbst übergeben?

Etwas mehr Kontext als die 2 Zeilen wäre hier hilfreich ;)
Ich sehe außerdem nicht wo du die $IP Variable übergibst, falls überhaupt...

Es sei denn ich bin gerade in die falsche Dokumentation gerutscht? :P
 
Zuletzt bearbeitet:
Mihawk90 schrieb:
https://pear.php.net/manual/en/package.database.db.db-common.execute.php



Wenn ich deine 2 Zeilen richtig lese hast du genau das nicht getan, sondern direkt das Statement selbst übergeben?

Etwas mehr Kontext als die 2 Zeilen wäre hier hilfreich ;)
Ich sehe außerdem nicht wo du die $IP Variable übergibst, falls überhaupt...

Es sei denn ich bin gerade in die falsche Dokumentation gerutscht? :P

Vor allem der Array dort ist mir nicht klar. Ist das ein array mit den paramtern des SP ?

$DB->execute('call statistic_url(?)', array(addslashes($base), 'TEST1234'));

schlug auch fehl

Das ist der usrsprüngliche Code für das alte statement mit 1 paramtere, das funktioniert.

Mir ist eben NICHT klar wo und wie ich den 2. Parameter $IP übergebe
 
Naja... Das Array was übergeben wird sind alle Werte welche in das Statement eingesetzt werden sollen. Da in dem Statement ("call statistic_url") aber nur ein Parameter ("(?)") enthalten ist, kann auch nur einer ersetzt werden. Wieso dann hier ein array verwendet wird sei mal dahingestellt, aber wie ich die Dokumentation sehe muss der zweite Parameter in execute() ein array sein, das würde also hinkommen. Was ich damit meine ist, dass "TEST1234" nirgendwo eingesetzt werden kann, da das Statement keinen zweiten parameter hat. Kurz gesagt braucht das statement ein zweites ? um mit "TEST1234" ersetzt zu werden.
Ich vermute aber mal das statement hat nur einen parameter...

Mal abgesehen davon rät selbst die Dokumentation von addslashes() in Datenbankanwendungen ab...
 
ja das stored procedure habe ich ja im mysql angepasst auf zwei param.

also so?
$DB->execute('call statistic_url(?,?)', array(addslashes($base), 'TEST1234'));
 
Zuletzt bearbeitet:
Ja, sollte so gehen.

Das erste ? wird durch den ersten Array Index (0) ersetzt, das zweite durch den zweiten, etc.

Im Zweifel ruf die procedure direkt im DB-Management Tool mit Test-parametern auf, schau welches Ergebnis du bekommst. Wenn du im Script dann dasselbe bekommst sollte es funktioniert haben :)

addslashes() solltest du ggf. trotzdem noch durch die passende DB-spezifische Version ersetzen, wie in der Dokumentation beschrieben. Außerdem würde ich einfach als gute Angewohnheit das SQL-Command (call) groß schreiben und die procedure in ` setzen, im falle einer deiner procedure namen verwendet mal reservierte Wörter ist es auf jeden Fall gut die Angewohnheit zu haben, dann hat man damit von vornherein kein Problem ;)


PS: Zitate eines kompletten Beitrags sind ungern gesehen wenn es direkt der nächste Post ist ;)
 
Zuletzt bearbeitet:
$DB->execute('call statistic_url(?,?)', array(addslashes($base)), '12345');

geht leider nicht...


IM Sql Tool klappt das mit den 2 parametern problemlos

call statistic_url('A1', '123');
SELECT * FROM D54.statistic_url;

das geht alles, also am mysql teil scheints nicht zu liegen :-o
 
Ich weiß nicht genau wie PHP das selbst formatiert, aber wenn du die procedure selbst aufrufst verwendest du ' ' (da string), im PHP Code werden die aber nicht verwendet, vermute dadurch vermurxt es das statement.

Versuchs mal so:
Code:
$DB->execute("CALL statistic_url('?','?')", array(addslashes($base), "TEST1234"));

Man beachte die Doppelten Anführungszeichen um den CALL, sonst kannst du die einfachen nicht nutzen.
 
leider will so auch nicht.
$DB->execute("CALL statistic_url('?','?')", array(addslashes($base), "TEST1234"));

Das script läuft zwar durch aber so schreibts für die Parameter ? ? in die DB...


So entsprechend ? zzzz

$DB->execute("CALL statistic_url('?','zzzz')", array(addslashes($base)), "TEST1234");


so...
jetzt gehts:
$DB->execute('CALL statistic_url(?,?)', array(addslashes($base), "TEST1234"));
 
Zuletzt bearbeitet: (solution)
Ach... jetzt seh ich erst den Fehler in deinem vorletzten Post :D

Du hattest:
Code:
$DB->execute('call statistic_url(?,?)', array(addslashes($base)), '12345');

An der Stelle wäre '12345' ein dritter Parameter für execute(), weil es außerhalb der array() Klammer ist :D

Aber gut, es funktioniert ja jetzt :)
 
Zurück
Oben