Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php][sql] parse error przy komedzie INSERT INTO
Gonzo44
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 19.07.2007

Ostrzeżenie: (0%)
-----


Witam

Proszę o pomoc w wyjaśnieniu pewnego dziwnego zachowania.
Poniższy zapis:
  1. <?php
  2. $dopisanie_pierwszego = "INSERT INTO `klienci`
  3. (`imie`)
  4. VALUES 
  5. ('$_SESSION['a']')";
  6. $r = mysql_query($dopisanie_pierwszego, $sql);
  7. ?>

daje błąd
Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in *************** on line i tu jest numer lini gdzie znajduje się ('$_SESSION['a']')";

Natomiast taki zapis:
  1. <?php
  2. $test = $_SESSION['a'];
  3. $dopisanie_pierwszego = "INSERT INTO `klienci`
  4. (`imie`)
  5. VALUES 
  6. ('$test')";
  7. $r = mysql_query($dopisanie_pierwszego, $sql);
  8. ?>

jest interpretowane prawidłowo.
Czemu?

Ten post edytował Gonzo44 6.09.2007, 18:09:25
Go to the top of the page
+Quote Post
Hazel
post
Post #2





Grupa: Zarejestrowani
Postów: 492
Pomógł: 33
Dołączył: 16.08.2007
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Apostrofy tak w PHP, jak i w SQL nie mogą się zagnieżdżać, czyli nie możesz zrobić czegoś takiego: ' 'cos tam' ', gdzie apostrofy wewnętrzne są zagnieżdżone w zewnętrznych - to nie jest prawidłowe... Nawet intuicyjnie. Jeśli musisz coś takiego zrobić, to prawidłowymi formami są " 'cos tam' " lub ' "cos tam" ', bo wtedy znaki są odrębne, nie wiem, czy dobrze tłumaczę.

Oczywiście, te 2 prawidłowe sposoby, które podałem nie odnoszą sie do Twojego kodu, bo tam masz zapytanie SQL w podwójnych cudzysłowach. Musisz zastosować na przykład funkcję extract" title="Zobacz w manualu PHP" target="_manual na tablicy $_SESSION, bądź ręcznie przypisać wartość elementu tablicy sesji do zwykłej, skalarnej zmiennej, co właśnie zrobiłeś w drugim kodzie. A poza tym, w zapytaniach SQL nie należy stosować tablic PHP - stąd kod drugi jest jedynym poprawnym.

Ten post edytował Hazel 6.09.2007, 18:34:01


--------------------
Go to the top of the page
+Quote Post
maziak
post
Post #3





Grupa: Zarejestrowani
Postów: 155
Pomógł: 17
Dołączył: 9.07.2007

Ostrzeżenie: (0%)
-----


zapewne chodzi o to,że używasz samych znakow " ' "
mianowicie :
('$_SESSION['a']')";
pierwszy ' informuje, że zaczął się ciąg znaków,a drugi ' informuje, że ciąg znaków się skończył, czego efektem jest to, że "a" jest poza ciągiem znaków. (po "a" rozpoczyna sie nowy ciąg w ktorym znajdzuje sie tylko " ] ".

Ten post edytował maziak 6.09.2007, 18:35:49
Go to the top of the page
+Quote Post
reversend
post
Post #4





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 27.07.2007

Ostrzeżenie: (0%)
-----


Można też po prostu skorzystać z kropki, która łączy ciągi znaków i zmienne:
  1. <?php
  2. $dopisanie_pierwszego = "INSERT INTO `klienci` (`imie`) VALUES ('".$_SESSION['a']."')";
  3. ?>


Ten post edytował reversend 6.09.2007, 19:02:56
Go to the top of the page
+Quote Post
Hazel
post
Post #5





Grupa: Zarejestrowani
Postów: 492
Pomógł: 33
Dołączył: 16.08.2007
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Rzadko, ale czasem nie działa poprawnie, zwłaszcza przy długich zapytaniach.
Lepiej jednak przypisywac długie nazwy zmiennych do krótszych.
Zresztą, każdy robi jak uważa.
Pozdrawiam.


--------------------
Go to the top of the page
+Quote Post
Gonzo44
post
Post #6





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 19.07.2007

Ostrzeżenie: (0%)
-----


Dzięki za wytłumaczenie. Teraz widze, że to oczywiste. Powoli zagnieżdża się parser w mojej głowie ;-)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 13:09