Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][sql] parse error przy komedzie INSERT INTO
Forum PHP.pl > Forum > Przedszkole
Gonzo44
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?
Hazel
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.
maziak
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 " ] ".
reversend
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. ?>
Hazel
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.
Gonzo44
Dzięki za wytłumaczenie. Teraz widze, że to oczywiste. Powoli zagnieżdża się parser w mojej głowie ;-)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.