Контроль синтаксиса MySQL или PHP при попытке выполнить условное обновление - PullRequest
2 голосов
/ 10 ноября 2009

Я думаю, что это проблема с выходом или что-то в этом роде. Когда я выполняю запрос и заполняю все переменные, все становится великолепно, и все строки корректно обновляются в БД.

Я посмотрел на StackOverflow, чтобы заставить меня работать с этими динамическими / сконструированными на лету запросами, и я в конце своей веревки.

Мои вещи выглядят так:

$sql="UPDATE users SET ";

if (!empty($fname)) { "fname = '$fname', ";}

if (!empty($lname)) { "lname = '$lname', ";}

if (!empty($location)) { "location = '$location', ";}

if (!empty($url)) { "url = '$url', ";}

"WHERE id = '$id' LIMIT 1";

Когда я разбиваю запрос для вставки «IF», ​​я получаю следующее: Ошибка: у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с '' в строке 1

Я запросил ECHO запрос, и по какой-то странной причине он не завершен, и переменные поступают до того, как запрос начнется, вот так

fname = 'Rob', lname = 'Smith', location = 'Jersey City, NJ', url = 'http://somesite.com', ОБНОВЛЕНИЕ пользователей SET Ошибка: У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с '' в строке 1

Извините, если мне не ясно. Я уточню, где это необходимо. Я новичок во всем этом. Спасибо!

Ответы [ 6 ]

6 голосов
/ 10 ноября 2009

Запрещается ставить запятую после последней заданной вами вещи.

Одно простое решение:

$set = array();
if (!empty($fname)) { $set[] = "fname = '$fname'";}
if (!empty($lname)) { $set[] = "lname = '$lname'";}
if (!empty($location)) { $set[] = "location = '$location'";}
if (!empty($url)) { $set[] = "url = '$url'";}

if(!empty($set)) {
  $sql = "UPDATE users SET ";
  $sql .= implode(', ', $set)
  $sql .= " WHERE id = '$id' LIMIT 1";
}

Да, и убедитесь, что переменные, которые вы вводите в запрос, безопасны для SQL; в противном случае возникнет проблема с внедрением SQL.

1 голос
/ 10 ноября 2009

Не совсем прямой ответ, но для динамических запросов я предлагаю использовать PDO . Таким образом, вы можете указать дополнительные параметры, более безопасные, элегантные и более простые.

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>

Если ваши запросы станут больше, то способ ведения дел теперь будет довольно сложен в обслуживании.

1 голос
/ 10 ноября 2009

лучше поместить все ваши SET в массив и внедрить их в строку. Таким образом, вы можете быть уверены, что нет висячих запятых. Что-то вроде:

if (!empty($fname)) $sets[]="fname = '$fname' ";
if (!empty($lname)) sets[]= "lname = '$lname' ";
if (!empty($location)) sets[]= "location = '$location' ";
if (!empty($url)) sets[]= "url = '$url' ";

$setstring= implode(',',$sets);
if($setstring) {
  $query="UPDATE users SET $sets WHERE id = '$id' LIMIT 1";
  //run query, etc.
} 
1 голос
/ 10 ноября 2009

Помните, что в этих языках программирования каждое утверждение (текст, заканчивающийся на;) очень похоже на законченное предложение. Вам нужен субъект-объект-глагол, чтобы он имел смысл. Я не могу просто сказать

 doggy;

Я должен сказать

 feed the doggy;

Точно так же я не могу просто сказать

 "fname = '$fname', "

когда я имею в виду «Добавить эту строку в запрос, который я начал ранее». Я должен быть явным:

 $sql .= "fname = '$fname', ";

Я говорю "Добавить этот текст в $ sql". Это полное предложение.

0 голосов
/ 10 ноября 2009

Я вижу две проблемы, перед WHERE нет пробела, что означает, что он может получить "url = http://www.stackoverflow.com"WHERE" и может вызвать проблему.

Кроме того, в конце каждого предложения SET есть запятая, последняя в списке не должна иметь запятой.

0 голосов
/ 10 ноября 2009

echo из вашего запроса и взгляните на запятые в наборе SET. У тебя слишком много? Недостаточно? Я думаю, вы обнаружите, что у вас есть одна лишняя запятая. Возможно, вы захотите использовать функцию implode(), чтобы создать предложение SET. Это вставит соответствующее количество запятых в соответствующих местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...