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 :(
nascita e morte non sono delle stringhe, mi sa che il problema è li...
Ciao
Marco
--
My blog
Working at @agavee
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...
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è?"
mmmm, ma quelle sono caratteri di escape? E' sicuramente quello il problema. ORa si tratta di capire perchè la stringa viene quotata....
--
Drupal e Siti Web Torino
Blog: Computer Graphics
eh, questa è una bella domanda... perchè db_query dovrebbe quotarmi gli apici nella stringa? che senso ha?
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 :D
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... :(
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?
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.
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:
ok, siamo alla rappresentazione dell'assurdo...
ho provato con questo "obbrobrio" di codice:
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)
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
Il mio sito con drupal