Переменная конкатенированная строка запроса mysql отлично работает в phpMyAdmin, но не в PHP в скрипте

ОБНОВЛЕНО 14.04.2011

Все еще в беде. Я сократил свой код до простейшей формы. Я использую функцию IF для проверки isset() на наличие флажка, который отлично работает. Если флажок установлен, он объединяет строку, состоящую из двух частей. Очень простой.

if (isset($_POST[testType1])) {
   $filterQuery .= "(testType1 = '1'"; 
   }
   $filterQuery .= ") ";
}

Когда я использую mysql_fetch_assoc и вывожу информацию в $rows, она работает. Но когда я просматриваю исходный код страницы в Google Chrome, он говорит: Invalid query: 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;

Если я повторяю $filterQuery, он отображается правильно, и когда я копирую эхо-строку в свой код, MySQL возвращает правильные результаты:

SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE (testType1 = '1')

Я также попытался применить $filterQuery к строке. Нет успеха.

ОБНОВЛЕНО 04.12.2011

У меня все еще есть проблема, это не опечатка. См. код ниже:

$query = "SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE ";`
$orTrigger = "";`

function setOrTrigger() {
    global $orTrigger;
    if ($orTrigger=="") {
        $orTrigger="OR ";
    }
}

function getTestFilterQuery($testType) {
   if (!(isset($_POST[test1])) && !(isset($_POST[test2])) && !(isset($_POST[test3]))) {
     $returnString = NULL;
     return $returnString;
   }

}

if (isset($_POST[testType1])) {
   $filterQuery .= $orTrigger ."(testType1 = '1'"; 
   setOrTrigger();
   $addTestFilterQuery = getTestFilterQuery("testType1");
   if ($addTestFilterQuery != NULL) {
    $filterQuery .= "AND " .$addTestFilterQuery;
   }
   $filterQuery .= ") ";
}

$connection = mysql_connect(localhost, $username, $password);

if (!$connection) {
   die('Not connected : ' . mysql_error());

}

$db_selected = mysql_select_db($database, $connection);

if (!$db_selected) {
   die ('Can\'t use db : ' . mysql_error());
}

$result = mysql_query($filterQuery);

if (!$result) {
   die('Invalid query: ' . mysql_error());
}

while ($row = @mysql_fetch_assoc($result)) {
   echo $row['name'];
   echo $row['description'];
}

Когда я повторяю $query, я получаю:

SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE (testType1 = '1')

Когда я копирую это прямо в mysql_query, например:

mysql_query("SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE (testType1 = '1')");

это работает нормально. Но когда я передаю переменную, например:

mysql_query ($ filterQuery);

я получаю синтаксическую ошибку рядом с ''. Кто-нибудь знает, как это решить?


person Mario111    schedule 11.04.2011    source источник
comment
Какая у вас ошибка? Может быть, показать нам свой код?   -  person halfdan    schedule 12.04.2011
comment
Можете ли вы привести пример кода фиксированной переменной, например, $tmp = 'myname' и выбор и то, как вы вставляете переменную в запрос   -  person BugFinder    schedule 12.04.2011
comment
Вероятно, вам следует опубликовать свой код. Иначе мы слепы.   -  person k to the z    schedule 12.04.2011
comment
The variable sql statement starts with "SELECT FROM... and ends with " да, круто. Но нам нужен реальный код.   -  person Vasiliy Ermolovich    schedule 12.04.2011
comment
это как угадывать в темноте .. но я предполагаю, что ответ - обратные кавычки   -  person Stewie    schedule 12.04.2011
comment
Лучшее, что я могу предложить, это выполнить var_dump/strlen для сгенерированной строки запроса и посмотреть, соответствует ли фактическая длина тому, что вы там видите. Возможно, есть какой-то скрытый управляющий символ, который отбрасывает запрос.   -  person Marc B    schedule 13.04.2011
comment
var_dump возвращает: string 'SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE (testType1 = '1') ' (length=86) Не уверен, что одинарные кавычки внутри одинарных кавычек могут быть проблемой, но я попытался использовать настоящий escape с ошибками в \'. Проверю снова.   -  person Mario111    schedule 13.04.2011


Ответы (3)


Вы действительно ставите двойные кавычки в строку, например:

$query = '"SELECT * FROM table WHERE col = value"';
echo $query; //output is exactly: "SELECT * FROM table WHERE col = value"

Если это так, вам нужно удалить "s внутри строки, mysql_query или что-то еще, что принимает обычную строку, например:

$query = "SELECT * FROM table WHERE col = value";
echo $query; //output is exactly: SELECT * FROM table WHERE col = value

Точно так же вы не заканчиваете SQL-запрос ; в строке, например: $query = "SELECT * FROM table WHERE col = value;";

person Phoenix    schedule 11.04.2011
comment
+1 за то, что не заканчивается на ; намекать. mysql_query не поддерживает множественные запросы - person gd1; 12.04.2011
comment
@Giacomo: больше похоже на то, что базовый драйвер этого не делает. mysql_query() просто передает строку запроса непосредственно вперед, ему все равно, есть ли там недопустимый синтаксис, один запрос или 500 запросов. - person Marc B; 12.04.2011
comment
@Marc: я только что обсуждал эффект с точки зрения клиента, независимо от реализации. Спасибо за ваше разъяснение. - person gd1; 13.04.2011

пример concat для запроса

$query = "select * from tablename ";
$query.= "WHERE id=1";
$query.= " and item_id= 'foo'";
person mcgrailm    schedule 11.04.2011
comment
code SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE (acc1 = '1') - person Mario111; 12.04.2011
comment
Извините за этот комментарий, новичок на этом сайте. Часть concat в порядке, работает как шарм, когда я повторяю $query, я получаю: SELECT * FROM fdatav1 JOIN ddatav1 ON ddatav1.ID = fdatav1.ID WHERE (acc1 = '1'), который работает в phpmyadmin, но, помещая его в $result = mysql_query($query), я получаю синтаксическую ошибку рядом с '' - person Mario111; 12.04.2011
comment
попробуйте это: ГДЕ (`acc1` = '1' ) - person Stewie; 12.04.2011
comment
@Stewie: обратные кавычки требуются только в том случае, если имя поля/таблицы является зарезервированным словом. - person Marc B; 12.04.2011

попробуйте добавить блок else к этому фрагменту кода, как показано ниже. в противном случае $filterQuery никогда не будет установлен, если только isset($_POST[testType1]).

if (isset($_POST[testType1])) {
   $filterQuery .= $orTrigger ."(testType1 = '1'"; 
   setOrTrigger();
   $addTestFilterQuery = getTestFilterQuery("testType1");
   if ($addTestFilterQuery != NULL) {
    $filterQuery .= "AND " .$addTestFilterQuery;
   }
   $filterQuery .= ") ";
} else {
   $filterQuery = $query;
}
person bumperbox    schedule 17.04.2011