ďťż

[MySQL/PHP] Błąd zapisu INSERT ?

       

Podstrony


telcocafe

Pojawia mi się następujący błąd:

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 'images/emots/smile.gif' alt='smile'> :) ' at line 1

Funkcja emoSet() która zmienia tekst przed zapisem:
function emoSet($str) { $chr = array(":)",";)",":(",";(",":[ ",";[",":]",";]",":P",";P",";p" ,":p",":D",";D",";d",":d",":|"," ;|",":/",";/","lol","LOL"); $chrt = array("<img src='images/emots/smile.gif' alt='smile'>","<img src='images/emots/smile.gif' alt='smile'>","<img src='images/emots/sad.gif' alt='sad'>","<img src='images/emots/sad.gif' alt='sad'>","<img src='images/emots/angry.gif' alt='angry'>","<img src='images/emots/angry.gif' alt='angry'>","<img src='images/emots/happy.gif' alt='happy'>","<img src='images/emots/happy.gif' alt='happy'>","<img src='images/emots/tongue.gif' alt='tongue'>","<img src='images/emots/tongue.gif' alt='tongue'>","<img src='images/emots/tongue.gif' alt='tongue'>","<img src='images/emots/tongue.gif' alt='tongue'>","<img src='images/emots/veryhappy.gif' alt='very happy'>","<img src='images/emots/veryhappy.gif' alt='very happy'>","<img src='images/emots/veryhappy.gif' alt='very happy'>","<img src='images/emots/veryhappy.gif' alt='very happy'>","<img src='images/emots/startled.gif' alt='startled'>","<img src='images/emots/startled.gif' alt='startled'>","<img src='images/emots/dry.gif' alt='dry'>","<img src='images/emots/dry.gif' alt='dry'>","<img src='images/emots/lol.gif' alt='lol'>","<img src='images/emots/lol.gif' alt='lol'>"); $stro = str_replace($chr,$chrt,$str); return $stro; }

Co jest źle? Bo nie wiem za bardzo co to za błąd ;/



A jak wygląda zapytanie? Być może tam się wszystko wysypuje, bo na pierwszy rzut oka wszystko tutaj jest dobrze. Poza tym, najpierw zamiast wykonywać zapytanie razem z wynikiem tej funkcji sprawdz jak ono wygląda - po prostu je sobie wyświetl.

Poza tym - dziwny masz styl. Poprawny html wymaga by atrybuty były pisane w cudzysłowiu a nie apostrofie. Natomiast w php lepiej stosować apostrofy, gdyż szybciej "mieli" te zmienne.
zamiast
"<img src='images/emots/smile.gif' alt='smile'>",
lepiej dać
'<img src="images/emots/smile.gif" alt="smile">',

$con = emoSet($_POST['content']); $dat = $_POST['date']; mysql_query("INSERT INTO portfolio_news VALUES ( NULL, '$tit' , '$con' , '$dat' );") or die(mysql_error());

Oto kod... Tabela ma pola po kolei id, n_title, n_content, n_date więc wszystko jest dobrze. Nie wiem co jest niepoprawnie bo inne (bez emotów) się dodają.

Więc się domyślam że przy takim dokładnie kodzie, i treści powiedzmy "blabla :)" otrzymamy takie cudo:
INSERT INTO portfolio_news VALUES ( NULL, '[tytul]' , 'blabla <img src='images/emots/smile.gif' alt='smile'>' , '$dat' );
czyli spójrzmy uważnie co się dzieje po '[tytul]', ':
Skrypt do zapytania wstawia blabla <img src= - w tym momencie pojawia się apostrof który zamyka poprzednio wprowadzony, ograniczający tą część zapytania - wszystko po tym apostrofie będzie traktowane jak część zapytania, a nie dana. images/emots/smile.gif będzie więc traktowane jako polecenie mysql! Następnie jednak znów otwiera się apostrof, i dodaje kolejny kawałek tekstu - alt= - i znowu zamyka się apostrof i znowu smile będzie potraktowane jako polecenie mysql. Później otwiera się apostrof, dodaje tekst > i zamyka apostrof, przecinek.
Widzisz już gdzie jest błąd? Rozwiązanie -> mój pierwszy post. I zmień w zapytaniu cudzysłowia na apostrofy i wzajemnie - i pisz w takiej formie, wygodniej i szybciej (optymalizacja). Teraz niech to wygląda tak:
mysql_query('INSERT INTO portfolio_news VALUES ( NULL, "'.$tit.'" , "'.$con.'" , "'.$dat.'" );') or die(mysql_error());

Btw - zrób też filtrowanie danych wprowadzonych przez użytkownika, bo w takiej formie jesteś narażony na sql injection.
Użytkownik Einzeinbleth edytował ten post 17 listopad 2006, 11:26


Spoko, dzieki, nie zauwazylem tego :)
A tak btw. to jest kawałek mojego 'admina' więc nikt oprócz mnie tych treści nie wprowadza. Chociaz lepiej dam htmlspecialchars i pare innych ;]

Jak dasz htmlspecialchars to Ci kod html nie zadziala, mysle ze w tym przykladzie w panelu admina to wazne. Uzywaj addslashes i stripslashes

Wcale nie chce kodu html używać, zrobiłem tylko pare znaczników bbcode ;)

Temat do zamknięcia

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.