2014-09-13 2 views
1

У меня нет шансов. Мой SQL-запрос будет отправляться только через PhpMyAdmin. Если я попытаюсь отправить этот конкретный запрос через PHP, я получаю сообщение об ошибке. Когда я копирую этот точный запрос в PhpMyAdmin, он проходит без проблем.Ошибка SQL возникает только в PHP-скрипте

INSERT INTO posts (id, content, poster, timestamp, tags) VALUES ('12056242', 'OMG I just got a #toyota', 'Clunker5', '09/12/14 08:43:36', 'toyota');INSERT INTO `tags` (tag, posts) VALUES ('toyota', 1) ON DUPLICATE KEY UPDATE posts=posts+1; UPDATE `tags` SET posts=posts+1 WHERE tag IN ('toyota'); 

Это PHP-код отношение к проблеме

//Ups one post for all tags entered by the user 
    if(!empty($tags)){ 
     $tags1 = explode(",", $tags); 
     $tags_submit = join("','", $tags1); 
     $tags_insert = join("', 1), ('", $tags1); 
     $sql = "INSERT INTO posts (id, content, poster, timestamp, tags) VALUES ('$d', '$b', '".$_SESSION['username']."', '$c', '$tags');" 
       . "INSERT INTO `tags` (tag, posts) VALUES ('".$tags_insert."', 1) 
         ON DUPLICATE KEY UPDATE posts=posts+1; 
         UPDATE `tags` SET posts=posts+1 WHERE tag IN ('".$tags_submit."');"; 

    $result = mysql_query($sql); 
    }else{ 
     $sql = "INSERT INTO posts (id, content, poster, timestamp, tags) VALUES ('$d', '$b', '".$_SESSION['username']."', '$c', '$tags');"; 

    $result = mysql_query($sql); 
    } 
    $error = mysql_error(); 
    if($result){ 
     echo "1"; 
    }else{ 
     echo error($sql, $error, "Tags: ".$tags, "Post: ".$b, "ID: ".$d); 
    } 

Ошибка

SQL Response: 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 'INSERT INTO `tags` (tag, posts) VALUES ('toyota', 1), ('ohmygoodness', 1) ' at line 1. 

EDIT: Теперь, когда я знаю, что я не могу сделать мульти-запрос, как может Я делаю этот запрос?

INSERT INTO `tags` (tag, posts) VALUES ('".$tags_insert."', 1) 
         ON DUPLICATE KEY UPDATE posts=posts+1; 
         UPDATE `tags` SET posts=posts+1 WHERE tag IN ('".$tags_submit."'); 
+1

Какая ошибка вы получаете? Вы проверяете mysql_error()? Вы убедились, что ваш запрос правильный после того, как переменные интерполированы? –

+1

3-й подобный вопрос сегодня. –

+0

'INSERT INTO теги (теги, сообщения) VALUES ('toyota', 1), ('ohmygoodness', 1)' - Я никогда не видел предложения VALUES, как это, как это работает? – David

ответ

2

Вы пытаетесь сделать несколько операторов в одном вызове этой функции API, но mysql_query() не поддерживает многопроцессорный запрос.

В любом случае вы не должны использовать многопроцессорный запрос. Вы можете подвергнуть себя целому классу SQL injection vulnerabilties.

Вы должны выполнять каждый SQL-запрос отдельно, в отдельных вызовах mysql_query().

Кроме того, комментарий от @JohnConde подходит: вы должны всегда проверять возвращаемое значение из mysql_query(), потому что она возвращает ложных если есть ошибка. Если это произойдет, зарегистрируйте или сообщите mysql_error(), чтобы узнать больше о том, что пошло не так.

1

От the mysql_query documentation:

Множественные запросы не поддерживаются.

Таким образом, вы не можете отправлять несколько инструкций, разделенных ;.

0

У меня была такая же проблема сегодня, у меня было 2 отличных ответа. Каждый раз, когда у вас есть инструкция SQL, вам нужно использовать mysql_query; это лучше пояснить, например, если у вас есть

"INSERT INTO query"; 
"INSERT INTO 2nd query"; 
mysql_query(process both query "INSERT INTO query"; 
this isn't going to work, it'll only work in phpmyadmin or 
in straight mysql command line sql. not in a php script. 

you'll need to: 

"INSERT INTO query"; 
mysql_query(process one query); //you should also use mysql_error() to see the response 
"INSERT INTO 2nd query"; 
mysql_query(process 2nd query); 

его необходимо будет сформировать в 2 отдельных запросах mysql. его функция безопасности на стороне php, чтобы предотвратить инъекции sql. по какой-то причине это то, что есть.

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