Newsgroup: it.comp.www.php
Titolo: chiamare store procedure da php con una decina di parametri: dove sbaglio?

Salve a tutti,
stavo provando le store procedures e finchï¿œ si tratta di fare una 
semplice select, tutto va bene.
Ora sto provando a fare una procedura piu complessa per la registrazione 
di un utente.
Poi cerco di richiamarla da un file php che ï¿œ l'action di un modulo html.
Di seguito riporto il file e la store procudure.
Mi sapreste indicare dove sbaglio?
Ottengo sempre "hai commesso un errore gravissimo!" come risultato alla 
chiamata.
STORE PROCEDURE:
DELIMITER |
CREATE PROCEDURE USR_CREATE
(
   IN   `p_username`        varchar(100),
   IN   `p_nome`            varchar(100),
   IN   `p_cognome`         varchar(100),
   IN   `p_azienda`         varchar(250),
   IN   `p_telefono`        varchar(45),
   IN   `p_fax`             varchar(45),
   IN   `p_website`         varchar(250),
   IN   `p_email`           varchar(250),
   IN   `p_attivita`        text,
   IN   `p_id_ruolo`        int(10),
   IN   `p_addr_via`        varchar(250),
   IN   `p_addr_civico`     varchar(10),
   IN   `p_addr_cap`        varchar(10),
   IN   `p_addr_citta`      varchar(250),
   IN   `p_addr_provincia`  varchar(250),
   IN   `p_addr_nazione`    varchar(250),
   IN   `p_password`        varchar(100),
   OUT  `o_id_user`         int(10)
)
BEGIN
DECLARE v_id_user INT(10);
         INSERT INTO PRDS_USR_USER(
                 username,
                 nome,
                 cognome,
                 azienda,
                 telefono,
                 fax,
                 website,
                 email,
                 attivita,
                 fk_id_ruolo,
                 addr_via,
                 addr_civico,
                 addr_cap,
                 addr_citta,
                 addr_provincia,
                 addr_nazione)
         VALUES(
                 p_username,
                 p_nome,
                 p_cognome,
                 p_azienda,
                 p_telefono,
                 p_fax,
                 p_website,
                 p_email,
                 p_attivita,
                 p_id_ruolo,
                 p_addr_via,
                 p_addr_civico,
                 p_addr_cap,
                 p_addr_citta,
                 p_addr_provincia,
                 p_addr_nazione);
SELECT LAST_INSERT_ID()
INTO v_id_user;
IF v_id_user IS NOT NULL THEN
         INSERT INTO PRDS_USR_PASSWORD(id_user, password)
         VALUES(v_id_user, PASSWORD(p_password));
         SET o_id_user = v_id_user;
END IF;
END|
DELIMITER ;
File in PHP:
<?php
require_once('Connections/prds.php');
$sql1 = "CALL USER_CREATE(" . $_POST['username'] . "," . $_POST['nome'] . ",
" . $_POST['cognome'] . ",
" . $_POST['azienda'] . ",
" . $_POST['telefono'] . ",
" . $_POST['fax'] . ",
" . $_POST['website'] . ",
" . $_POST['email'] . ",
" . $_POST['attivita'] . ",
" . $_POST['id_ruolo'] . ",
" . $_POST['addr_via'] . ",
" . $_POST['addr_civico'] . ",
" . $_POST['addr_cap'] . ",
" . $_POST['addr_citta'] . ",
" . $_POST['addr_provincia'] . ",
" . $_POST['addr_nazione'] . ",
" . $_POST['password'] . ",
@o_id_user)";
$rs = $mysqli->query($sql1);
if ($rs)
echo "tutto a buon fine";
else echo "hai commesso un errore gravissimo!";
echo "<br>".$_POST['nome']."<br>".
$_POST['cognome']."<br>".
$_POST['azienda']."<br>".
$_POST['telefono']."<br>".
$_POST['fax']."<br>".
$_POST['website']."<br>".
$_POST['email']."<br>".
$_POST['attivita']."<br>".
$_POST['id_ruolo']."<br>".
$_POST['addr_via']."<br>".
$_POST['addr_civico']."<br>".
$_POST['addr_cap']."<br>".
$_POST['addr_citta']."<br>".
$_POST['addr_provincia']."<br>".
$_POST['addr_nazione']."<br>".
$_POST['username']."<br>".
$_POST['password'];
?>
Grazie mille,
Franz

 chiamata.
ecco invece di stamapare "hai commesso un errore gravissimo" sarebbe 
meglio tu stampassi l'errore vero e proprio:
http://www.php.net/manual/en/mysqli.error.php

 
http://www.php.net/manual/en/mysqli.error.php
grazie.
mi dice che ho un errore di sintassi in $sql1,
ovvero la chiamata alla stored procedure.
Qualche suggerimento su come fargliela eseguire senza problemi?
Franz



riporta l'errore per intero

 $sql1 = "CALL USER_CREATE(" . $_POST['username'] . "," . $_POST['nome']
A occhio e croce ti mancano tutte le virgolette (singole) per i parametri 
stringa.
E ti manca anche l'escape dei dati.
O lo fai manualmente con mysqli_real_escape_string o usi gli statement e 
fai fare a lui entrambe le cose.
Bye

 fai fare a lui entrambe le cose.
ciao.
grazie per il suggerimento.
innanzitutto l'errore è:
You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near '$sql1' at 
line 1
Poi, ho aggiunto gli apici e infatti se stampo a video la query ora ottengo
CALL CREATE_USR('param1', 'param2', etc..., @o_id_user)
L'errore però rimane.
non vorrei che sia sbagliato proprio il modo in cui chiamo la SP.
Consigli inmerito?
Grazie mille.
Franz

 line 1
Siccome nella tua stringa non c'e` mai "$sql1", sembra quasi che tu usi
$mysqli->query('$sql1')
(con le virgolette). Ma nel codice che hai riportato non ci sono, quindi 
boh. :)
Bye.

 boh. :)
allora:
ho tolto le virgolette e ora ho $mysqli->query($sqli)
Risultato: non ho piu quel problema, ma ora ne ho uno che non capisco:
CALL USR_CREATE(myuser,mionome,mio cognome,azienda,3383345116,0802142185,
www.miosito.it
,
ma...@mail.it
,accountmanager,1,
via tal de tali,28,20110,milano,mi,italia,ciccio, @outid)
You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near 
'cognome,azienda,3383345116,0802142185,
www.miosito.it
,
ma...@mail.it
,accountmanager,1,
via tal' at line 1
In pratica gli fa schifo il fatto che io abbia scritto "mio cognome" 
ovvero una parola con uno spazio in mezzo.
Infatti se scrivo miocognome, l'errore si sposta su "@
mail.it
".
Se poi tolgo tutti gli spazi e le chiocciole, ottengo quest altro errore:
Unknown column 'myuser' in 'field list'
Ma dove diavolo sbaglio?? Sono distrutto.
Grazie
Franz

 Bye.
allora:
ho tolto le virgolette e ora ho $mysqli->query($sqli)
Risultato: non ho piu quel problema, ma ora ne ho uno che non capisco:
CALL USR_CREATE(myuser,mionome,mio cognome,azienda,333444555,066546546,
www.miosito.it
,
ma...@mail.it
,accountmanager,1,
via tal de tali,28,20110,milano,mi,italia,ciccio, @outid)
You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near 
'cognome,azienda,333444555,066546546,


 Ma dove diavolo sbaglio?? Sono distrutto. Grazie
i valori che passi devono stare tra virgolette:
$sql1 = "CALL USER_CREATE('" . $_POST['username'] . "','" . $_POST
['nome'] . "','
" . $_POST['cognome'] . "','
" . $_POST['azienda'] . "','
etc etc

 etc etc
Ciao Redwiz,
grazie.
Scusa per l'errore di digitazione. Naturalmente era sql1 come prima.
Ho messo le virgolette e ha funzionato...una sola volta!
Il mio entusiasmo si è spento subito dopo, quando ho riprovato con nuovi 
dati e ho ottenuto:
Cannot add or update a child row: a foreign key constraint fails 
(`miodb/prds_usr_user`, CONSTRAINT `FK_USER_ROLE` FOREIGN KEY 
(`fk_id_ruolo`) REFERENCES `prds_usr_role` (`id_role`))
Non capisco.
Si tratta di una foreign key che ho nella tabella prds_usr_user che si 
riferisce
alla tabella prds_usr_role.
Bah...oggi impazzirò, lo sento.
Franz

 Bah...oggi impazzirò, lo sento.
ho eliminato dal form l'inserimento del fk_id_ruolo e ora tutto funziona.
Dovrò risolvere la questione delle foreign keys, altrimenti non potrò 
gestire alcune funzioni.
Grazie per la pazienza a tutti.
Franz