2011-12-16 2 views
0

Я пытаюсь взять весь массив сообщений и поместить каждое значение в инструкцию select, которая обновит предыдущее значение. У меня возникли проблемы с этим в php с выводом строки.php sql statement

Это SQL заявление, которое я пытаюсь передать:

UPDATE test1l.testtable SET age=106, weight=345, WHERE id=11 

Так страница представления первого помещает массив $ _POST в переменную. Затем я пытаюсь установить утверждение так, чтобы каждая переменная сообщения находилась в нужном месте.

$dataArray = $_POST; 
$Sql =" UPDATE test1l.testtable SET age=$dataArray['age'],weight=$dataArray['weight'] WHERE id=$dataArray['id']" 

Одиночные и двойные кавычки вводят мое заявление вверх. Кроме того, у меня есть пользовательская функция, которая является символом, избегающим этих строк, чтобы помочь остановить инъекцию.

+2

Удалить запятые перед WHERE: 'UPDATE test1l.testtable SET age = 106, weight = 345 WHERE id = 11' –

+0

У меня возникли проблемы с помещением в строку php. Как, где поставить какие цитаты. Это была всего лишь копия макаронной ошибки – lodkkx

+0

«У меня есть пользовательская функция, которая является символом, избегающим этих строк, чтобы помочь остановить инъекцию». Зачем использовать пользовательскую функцию? Там уже встроены функции для этого. –

ответ

2

Используйте конкатенацию:

'update ... SET age = ' . $dataArray['age'] . ', weight = ...' 

И убедитесь, что вы проверяете и должным образом избегаете своих атрибутов post, чтобы избежать инъекции SQL ион. Или еще лучше: используйте подготовленные заявления. См http://php.net/manual/fr/mysqli.prepare.php

1

Сохраните введенный пользователем ввод (mysql_real_escape_string для неизвестного ввода) в переменной, затем используйте sprintf, как показано ниже. Эта строка кода никогда не будет ломаться, если только некоторые из переменных не определены или неверная информация о базе данных.

$query = sprintf("UPDATE test1l.testtable SET age='%s', weight='%s' WHERE id='%s'", $age, $weight, $id); 
+0

Спасибо, что мне нужно / – lodkkx

0

я это сделать, как этот

$mysqli->query("UPDATE test1l.testtable SET age='".$dataArray['age']."', 
      weight='".$dataArray['weight']."' WHERE id='".$dataArray['id']."' ") 

просто упаковывают вы не знали, вы можете удалить тиков внутри скобок: $dataArray[age]

1

что-то вроде этого будет безопаснее:

$dataArray = $_POST; 
$Sql =" UPDATE test1l.testtable SET age=?, weight=? WHERE id=?"; 
$Statement = $mysqli->prepare($Sql); 
$Statement->bind_param('iii', $dataArray['age'], 
           $dataArray['weight'], 
           $dataArray['id']); 
$Statement->execute(); 
1

Если вы собираетесь с форматом, как это:

$Sql =" UPDATE test1l.testtable SET age=$dataArray['age'],weight=$dataArray['weight'] WHERE id=$dataArray['id']" 

Это должно быть сделано, как это:

$Sql ="UPDATE test1l.testtable SET age={$dataArray['age']},weight={$dataArray['weight']} WHERE id={$dataArray['id']}"; 

Вы должны окружить сложные переменные, такие как массив и объекты, с помощью {} при работе внутри double кавычки.

$string = "print {$object->param} and {$array['key']}"; 

Также не забывайте ваш запрос имеет дело со всеми целыми полями - как только вы получите строковых полей в БД, как VARCHAR, полукокса, текст - вы запрос должен окружить их в одинарные кавычки, как это:

$Sql ="UPDATE test1l.textfield SET textfield='{$dataArray['age']}' WHERE id={$dataArray['id']}"; 

Кроме того, как упоминалось любой переменной на основе пользовательского ввода, предназначенный для часть SQL даного следует использовать либо параметризованные заявления или функцию mysql_real_escape_string.

Как примечание это, где вы должны изменить в формат строки здание больше похоже:

$sql= 'UPDATE test1l.testtable SET age='.mysql_real_escape_string($dataArray['age']).', weight='.mysql_real_escape_string($dataArray['weight']).' WHERE id='.mysql_real_escape_string($dataArray['id']); 

И в идеале вы бы извлечь это в одну функцию, которая бы санитарной обработки всех полей, предназначенных для базы данных с mysql_real_escape_string, поэтому вам не нужно продолжать делать такие уродливые/нечитаемые строки sql.