2012-01-27 5 views
3

Когда я пытаюсь обновить таблицу вместо увеличения по массиву URL-адресов, то, что напечатано в таблице, является только последней записью в массиве url.Обновить таблицу MySQL с foreach()

Когда я эхо-сигнал $url, я могу сказать, что он правильно проходит через массив. Когда я эхо $currentId приращения правильно. Почему запрос не вводит каждый $url в строке в моей таблице. Что здесь происходит, что я не понимаю?

$currentId = 1; 
foreach($pages as $url) 
{ 
    $query = "UPDATE pageurls SET url='$url' WHERE id='currentId'"; 
    mysql_query($query); 
    echo($url.'<br/>'); 
    $currentId++; 
} 

ответ

5

Вы сравниваете строку: WHERE id='currentId'

Должно быть переменной WHERE id='$currentId'

2

currentId используется как строка, а не переменной.

Кроме того, вы должны убедиться, что вы избежать этих значений с mysql_real_escape_string()

+2

Это на самом деле не о входе пользователя, это о том, уверен, что MySQL считает специальный символ будет обрабатываться правильно. Это отличная привычка. –

+0

@Topener: так как система должна быть запрограммирована кем-то, она все равно «пользовательский» вход (особенно если вы используете младшие кодеры). Тем не менее, вероятно, было бы разумнее: a) использовать правильный тип (например, '(int) $ currentId') или b) параметризованные запросы, чем слепо бросить все в строку. – Piskvor

10

Вместо

$query = "UPDATE pageurls SET url='$url' WHERE id='currentId'"; 

... который ищет идентификатор, совпадающим с строки "currentId", попробуйте ...

$query = "UPDATE pageurls SET url='".mysql_real_escape_string($url). 
     "' WHERE id=".$currentId; 

Поскольку вы генерируете currentId сами, это безопасно, но вы должны действительно избежать $ URL с помощью mysql_re al_escape_string.

Редактировать: Поскольку @Topener указывает, я пропустил $ before currentId, отредактированный, чтобы исправить это.

+0

все еще неправильно, это вызовет ошибку.См. Мой ответ –

+0

@Topener На самом деле, в руководстве указано; «Эта функция должна всегда (за небольшим исключением) использоваться для обеспечения безопасности данных перед отправкой запроса в MySQL.», Даже созданная вами строка может включать символ «». –

+0

@Topener: Это не вызовет ошибки. Если вы ссылаетесь на то, что он оставил одинарные кавычки, это, вероятно, было сделано специально, учитывая, что столбец с именем 'id' в 9 раз из 10 будет иметь числовое значение в любой заданной схеме, и это поддерживается в OP этой строкой: '$ currentId = 1'. – FtDRbwLXw6

0

Существует ошибка в этой строке:

$query = "UPDATE pageurls SET url='$url' WHERE id='currentId'"; 

Я хотел бы изменить это так:

$query = "UPDATE pageurls SET url='".$url."' WHERE id=".$currentId; 
0

Убедитесь, что вы правильно избежать переменных, используемых в запросе (выглядит intval() для id/$currentId, если это происходит от пользовательского ввода или от любого внешнего источника, и mysql_real_escape_string() для url, как сказал @Louis). Затем интерполируйте их в запрос и не указывайте $currentId, если это действительно целое число.

$currentId = 1; 

foreach($pages as $url) { 

    $query = "UPDATE pageurls SET url = '{$url}' WHERE id = {$currentId}"; 

    mysql_query($query); 

    echo($url . '<br/>'); 

    $currentId++; 

} 
// foreach 
-1

Вы используете строки вместо переменных!

Этот запрос является серьезным! Для вас потребуется много ресурсов, если вы обновите множество строк!

Посмотрите: «Update Multiple Rows With Different Values and a Single SQL Query»

+0

Только 21 строка, потому что я пытаюсь понять, почему эхо выводит правильную вещь (таким образом, я знаю, что переменные получают правильные значения каждый раз через цикл), но таблица mysql печатает только последнее значение URL 21 раз. – user1155445

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