2012-04-01 2 views
3

Я пытаюсь сделать что-то, но я столкнулся с проблемой. Я пробовал все, что знаю, но я новичок в MySQL, поэтому я зашел в тупик.Ошибка синтаксиса SQL при использовании MySQL и PHP

Этот код:

<?php 
    require('cfg.php'); 
    mysql_connect($server, $user, $pass) or die(mysql_error()); 
    mysql_select_db($database) or die(mysql_error()); 

    if (isset($_GET['name'])){ 
     $name = $_GET['name']; 
    } 
    else 
     if (isset($_POST['submit'])){ 
      $name = $_POST['name']; 
      $name1 = $_POST['name1']; 
      $name2 = $_POST['name2']; 
      $name3 = $_POST['name3']; 
      mysql_query("INSERT INTO data (name, name1, name2, name3) VALUES($name, $name1, $name2, $name3) ") or die(mysql_error()); 
      echo ("Data entered successfully!"); 
     } 
?> 

<html> 
    <head> 
     <title>Random giffgaff simmer</title> 
    </head> 
    <body> 
     <form action="" method="post"> 
      <p>Your Username: <input type="text" name="name"></p> 
      <p>Username 1: <input type="text" name="name1"></p> 
      <p>Username 2: <input type="text" name="name2"></p> 
      <p>Username 3: <input type="text" name="name3"></p> 
      <p>Username 4: <input type="text" name="name4"></p> 
      <p>Username 5: <input type="text" name="name5"></p> 
      <p>Username 6: <input type="text" name="name6"></p> 
      <p><input type="submit" name="submit" value="Submit"></p> 
     </form> 
    </body> 
</html> 

приносит эту ошибку:

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

Теперь, что бы сказать мне, что этот SQL-код содержит синтаксическую ошибку:

INSERT INTO data (name, name1, name2, name3) VALUES($name, $name1, $name2, $name3) 

Но я донской Думаю, я могу его увидеть?

+4

Это взломанный дружелюбный. Другими словами, он чрезвычайно восприимчив к SQL-инъекции. –

+0

Ну, мне удалось избавиться от этой ошибки, заполнив ВСЕ поля (что раздражает), но теперь я получаю эту ошибку: «Неизвестная колонковая пицца в списке полей» с пиццей, являющейся значением $ name? –

+0

@cillosis Почему? Как это будет работать? –

ответ

3

Вы не указали свой запрос. Вы должны цитировать каждое поле, как этот

INSERT INTO data (name, name1, name2, name3) VALUES('$name', '$name1', '$name2', '$name3') 

В качестве дани TheCommonSense, я обеспечиваю версию Mysqli, используя правильную подготовленное заявление для безопасности данных

$db = new mysqli(...); 
$stmt = $db -> prepare("INSERT INTO data (name, name1, name2, name3) VALUES(?, ?, ?, ?)"); 
$stmt -> bind_param("ssss", $name, $name1, $name2, $name3); 
$stmt -> execute(); 
$db -> close() 
+0

Спасибо. Это сработало, и было легко и просто. –

+0

(Предупреждение: вот-вот наступит момент) Да, это тоже то же самое, что и 3 человека, отправленные за 5 минут до этого. – Corbin

+0

@Corbin, Chill man, я не тот, кто ниспровергает любого из ваших ребят, я тоже проголосовал за ваш комментарий. – Starx

2

Строки должны быть процитированы и экранированы.

$name = (isset($_POST['name'])) ? $_POST['name'] : ''; 
$name = mysql_real_escape_string($name); 
$query = "INSERT INTO blah (name, ...) VALUES ('{$name}', ...)"; 

Вы, кстати, захотите изучить SQL-инъекцию. Кроме того, прежде чем вы заходите слишком далеко по дороге, вам стоит пойти и отказаться от mysql_ * в пользу PDO. PDO предлагает поддержку нескольких драйверов * (MySQL/SQLite/MSSQL/etc) и может выполнять подготовленные операторы (более чистые/более безопасные, чем mysql_real_escape_string).

* это не делает SQL магически переносимым, но это действительно помогает.

+0

@YourCommonSense не знаю, была ли это опечатка, но так, как вы это сформулировали определенно яснее :). – Corbin

+2

Понизьте избирателей, чтобы объяснить? – Corbin

+0

Это ваша проблема. Это ошибка, но вы этого не знаете. Вы говорите «более чистый или более безопасный, чем mysql_real_escape_string», как будто mysql_real_escape_string имеет какое-либо отношение к безопасности, пока это не так. –

1

Я предполагаю, что $name, $name1 и т. Д. Являются строками? Вы должны включать их в одиночные кавычки. Попробуйте:

"INSERT INTO `data` (`name`, `name1`, `name2`, `name3`) VALUES ('$name', '$name1', '$name2', '$name3')" 

Помните также, чтобы избежать всей входной Предоставленного пользователя струны значения, которые потенциально могут действовать как инъекции SQL (см здесь: http://php.net/manual/en/security.database.sql-injection.php) с mysql_real_escape_string() перед передачей их в запрос, или переключатель к расширению mysqli и использовать подготовленные заявления (лучший вариант).

+3

Почему голос? – MichaelRushton

+0

Сообщая OP «чтобы избежать всех входных данных», вы просите их реализовать своего рода волшебную функцию кавычек, которая является порочащей и устаревшей. –

+0

Итак, вы предпочли бы, чтобы они ввели данные, как это дается пользователем? – MichaelRushton

1
mysql_query("INSERT INTO data (name, name1, name2, name3) VALUES('$name', '$name1', '$name2', '$name3') ") or die(mysql_error()); 

или

mysql_query("INSERT INTO data (name, name1, name2, name3) VALUES('".$name."', '".$name1."', '".$name2."', '".$name3."') ") or die(mysql_error()); 

Попробуйте это

+0

Нет необходимости связывать вары – Starx

+0

На самом деле, ответ лучше без или части – Starx

Смежные вопросы