Tom: mysql-i_* versa mysql_*

Beitrag lesen

Hello,

Aber wie Du das mit den Stored Procedures meinst, ist mir nicht klar.

Wenn man eine Stored Procedure in die Datenbank tun will, kann dies nur über mysqli_multi_query() geschehen, da mysqli_query() und mysql_query() beim Auftreten des ersten Semikolons im String abschneiden.

Das könnte natürlich glatt so sein. Per PHP habe ich sie tatsächlich noch nie angelegt.
Der phpMyAdmin kann (konnte?) es ja auch nicht.

Ich habe sie bisher immer über SQL-Front oder als das noch nicht wieder auf dem Markt war, über die mysql-Konsole erfasst. Macht man ja eigentlich auch nicht so oft, wenn sie vorher gut durchdacht worden sind.

Einen SP-Call mittels Query-Statement kann man doch über die normalen mysql_* Funktionen auch schon nutzen?

Hab ich noch nie gemacht, die Doku von MySQL deutet aber darauf hin, dass ein Query mit "CALL" eventuell ein multiples Ergebnis zurückgibt bzw. zurückgeben könnte, weshalb der Query allein schon mit mysqli_multi_query() ausgeführt werden sollte.

Muss ich mir nochmal genauer ansehen.
Der einfache Call hat bisher immer geklappt.

Aber ich habe das eben nochmal überprüft:

Ich habe mittels Strored Procedure einige (teilweise fest verdrahtete) Select-Statements laufen, die automatisch eine Historie schreiben, also quasi einen "on Select Trigger" nachbilden. Der Datenbankuser muss dabei keinerlei Rechte auf die Tabellen haben, das Execute-Recht für die SP reicht.

Das funktioniert mit mysql_query nicht. Da gibt es einen Fehler, dass der Rückgabewert nicht im Kontext abgeliefert werden kann. Mit mysqli_query klappt das dann.

Im Prinzip sieht es (gekürzt) so aus:

CREATE DEFINER=superuser@% PROCEDURE wgr\_select()
    COMMENT 'Warengruppen abfragen'
begin
  insert into testserver.historie set qtype='select', uname=user();
  select id_wgr, name from wgr;
end;

#-------------------

$sql = "call testserver.wgr_select()";
$res = mysqli_query($con, $sql);

if (mysqli_errno($con)> 0) die('Fehler beim Query '.mysqli_error($con));

Ich war letztens dabei abgestürzt, wei man die Statements in der SP bindet, wenn es notwendig ist.
Bei diesem ist es nicht unbedingt notwendig, weil ein zuu späte geschriebener Historie-Datensatz die Integrität nicht gefährdet, aber bei anderen PS ist es notwendig. An der Transaction innerhalb einer  SP knabber ich noch.

Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)