guerra con db_query

11 risposte
Joined: 27 Dic 2006
User offline. Last seen 1 anno 15 settimane ago.

Ciao a tutti,

ho questa riga di codice:

<?php
       $ok
=db_query("INSERT INTO {artisti} (nome, cognome, nascita, morte, descrizione) VALUES ('%s', '%s', '%s', '%s', '%s')",
                  
$form_values['hmai_nome'],
                      
$form_values['hmai_cognome'],
                      
$n,
                      
$m,
                      
$form_values['hmai_descrizione']);
?>

che fallisce, dicendomi:

user warning: 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 '\'mario\', \'rossi\', \'1979-05-14\', NULL, \'description\')' at line 1 query: INSERT INTO artisti (nome, cognome, nascita, morte, descrizione) VALUES (\'mario\', \'rossi\', \'1979-05-14\', NULL, \'description\') in /web/htdocs/www.mysite.com/home/includes/database.mysql.inc on line 172.

e questa è la struttura della tabella:

CREATE TABLE `artisti` (
  `idartista` int(10) unsigned NOT NULL auto_increment,
  `nome` varchar(50) NOT NULL default '',
  `cognome` varchar(50) NOT NULL default '',
  `nascita` date default '0000-00-00',
  `morte` date default '0000-00-00',
  `descrizione` text,
  PRIMARY KEY  (`idartista`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1

cosa diavolo non gli va bene? non riesco a capirlo Sad

Joined: 1 Gen 2007
User offline. Last seen 2 ore 15 min ago.

nascita e morte non sono delle stringhe, mi sa che il problema è li...

__________________

Ciao
    Mavimo
_________________
Io mio sito su Drupal, CFD e OpenFOAM (e se vi chiedete cosa c'entrano l'uno con l'altro.. bhè, non so nemmeno io la risposta Sticking out tongue )

Joined: 27 Dic 2006
User offline. Last seen 1 anno 15 settimane ago.

nascita e morte sono delle date infatti... ma nella stringa sql le immetto come stringhe (è una vita che faccio così), non c'è modo di specificare che siano delle date...

Joined: 27 Dic 2006
User offline. Last seen 1 anno 15 settimane ago.

ho fatto la insert bypassando drupal e usando mysql_query....

risultato? ha funzionato perfettamente! Questo mi fa supporre che sia db_query a combinare qualcosa che poi crea casini... il problema ora è "cosa combina? e perchè?"

Joined: 24 Apr 2005
User offline. Last seen 2 giorni 3 ore ago.

mmmm, ma quelle sono caratteri di escape? E' sicuramente quello il problema. ORa si tratta di capire perchè la stringa viene quotata....

__________________

Joined: 27 Dic 2006
User offline. Last seen 1 anno 15 settimane ago.

eh, questa è una bella domanda... perchè db_query dovrebbe quotarmi gli apici nella stringa? che senso ha?

Joined: 2 Feb 2006
User offline. Last seen 11 settimane 1 giorno ago.

Scusa se sei in vena di prove fa anche questa (premetto che io non l'ho fatta): al posto di db_query mettici db_rewrite_sql e racchiudi il tutto con db_query... guarda il manuale delle api perché non ricordo la sintassi esatta delle due e sono abbastanza in ritardo per il pranzo Laughing out loud

Joined: 27 Dic 2006
User offline. Last seen 1 anno 15 settimane ago.

purtroppo la rewrite può essere usata solo con alcune tabelle del core di drupal ("Possible values are: comments, forum, node, menu, term_data, vocabulary.") mentre la tabella che uso è fatta da me... Sad

Quello che non capisco è il senso della cosa... se non metto gli apici, db_query non ce li mette e mi da errore... se ce li metto, me li quota e mi da errore... ma se questa funzione esiste e viene usata, c'è anche un modo per farla funzionare, no? Il fatto è che in tutti gli esempi che mi son guardato, gli apici erano messi come li ho messi io... a questo punto vorrei capire cosa di preciso c'è di diverso per far comportare db_query in questo modo...

come posso tracciare la stringa mentre fa il giro nel codice di drupal, per vedere in quale punto di preciso succede sto casino?

Joined: 2 Feb 2006
User offline. Last seen 11 settimane 1 giorno ago.

in effetti la rewrite_sql l'avevo usata per una query sulla tabella nodes... e non ricordavo sto particolare, però se togli gli apici da vicino gli identificatori %s presumo che la db_query dovrebbe andare o sbalgio?. Il fatto che venga quotata può essere una misura contro l'sql-injection.

Joined: 27 Dic 2006
User offline. Last seen 1 anno 15 settimane ago.

Se non metto gli apici io, non ce li mette nessuno, e poi ovviamente mi viene dato errore... ecco cosa ottengo senza apici:

user warning: 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 ' , )' at line 1 query: INSERT INTO artisti (nome, cognome, nascita, morte, descrizione) VALUES (mario, rossi, , , ) in /web/htdocs/www.miosito.com/home/includes/database.mysql.inc on line 172.

questo è il codice sorgente:

<?php
       $ok
=db_query("INSERT INTO {artisti} (nome, cognome, nascita, morte, descrizione) VALUES (%s, %s, %s, %s, %s)",
                  
$form_values['hmai_nome'],
                      
$form_values['hmai_cognome'],
                      
$n,
                      
$m,
                      
$form_values['hmai_descrizione']);
?>

Joined: 27 Dic 2006
User offline. Last seen 1 anno 15 settimane ago.

ok, siamo alla rappresentazione dell'assurdo...

ho provato con questo "obbrobrio" di codice:

<?php
       $ok
=db_query("INSERT INTO {artisti} (nome, cognome, nascita, morte, descrizione) VALUES (\"%s\", \"%s\", \"%s\", \"%s\", \"%s\")",
                      
$form_values['hmai_nome'],
                      
$form_values['hmai_cognome'],
                      
$n,
                      
$m,
                      
$form_values['hmai_descrizione']);
?>

e indovinate? Funziona!!!!!!

Con una differenza... bypassando db_query e usando la mysql_query, nel database mi ritrovo questi 5 valori:

nome,cognome,NULL,NULL,NULL

Se uso l'obbrobrio, mi ritrovo:

nome,cognome,0000-00-00,0000-00-00,
(stringa vuota ma non null per l'ultimo dato)

Joined: 21 Maggio 2005
User offline. Last seen 5 giorni 5 ore ago.

Ciao,

Per evitare iniezioni sql drupal bonifica le query con db_query, questa funzione si preoccupa di fare tutto quindi dovete utilizzarla senza carattery di escape.
L'utilizzo dovrebbe essere

<?php
       $ok
=db_query("INSERT INTO {artisti} (nome, cognome, nascita, morte, descrizione) VALUES ( '%s', '%s', '%s', '%s', '%s')",
                      
$form_values['hmai_nome'],
                      
$form_values['hmai_cognome'],
                      
$n,
                      
$m,
                      
$form_values['hmai_descrizione']);
?>

__________________

Uccio

Condividi contenuti