2009-11-10 3 views
2

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

Я смотрел 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"; 

Когда я нарушу запрос, чтобы вставить «МСФ» я получаю следующее: Ошибка: У Вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом с «» в строке 1

Я ECHO'd запрос и по какой-то причине это Nto полное и переменные приходят до запрос начать как так

имя_файла = 'Rob', LNAME = 'Smith', местоположение = 'Джерси-Сити, штат Нью-Джерси', URL = 'http://somesite.com', пользователи UPDATE SETошибка: у вас ошибка в вашей Синтаксис SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '' по строке 1

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

ответ

6

вы не позволяется иметь запятую после последней вещи вы SET

одно простое решение заключается в следующем:..

$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-инъекцией.

+0

Ненавижу это! вам нужно поститься, чтобы стрелять здесь. это похоже на 98% моего ответа! +1 для вас! –

+0

Большое спасибо. Я такой тупой немой! –

+0

Также, для других зеленых лошадей, обязательно не пытайтесь использовать эту новую функцию «IMPODE»;) Еще раз спасибо, Frank –

0

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

0

Я вижу две проблемы, там нет места, прежде чем WHERE, которое означает, что он может оказаться «URL = http://www.stackoverflow.com„ГДЕ“и может быть причиной проблемы.

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

1

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

doggy; 

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

feed the doggy; 

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

"fname = '$fname', " 

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

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

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

+0

Я заметил то же самое, но я думаю, что это, вероятно, просто ошибка транскрипции. –

+0

oh lol, возможно. –

1

лучше разместить все свои 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

на самом деле не прямой ответ, но для динамических запросов я предлагаю использовать 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(); 
?> 

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

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