Обновление таблицы MySQL с помощью массива с использованием Foreach - PullRequest
1 голос
/ 27 января 2011

Это сводит меня с ума, поэтому, пожалуйста, помогите.

Я пытаюсь обновить таблицу Mysql с помощью массива.

Примерно так

$a = array('1', '2', '3');

foreach($a as $id){

mysql_query("UPDATE table SET id = '$id' WHERE column = 'something'") or die(mysql_error());

}

Итак, послестолбец обновления id должен иметь значения 1, 2, 3 Вместо этого он обновляется с помощью 1, 1, 1

Не совсем то, что я хочу.

Может кто-нибудь показать, что я делаю неправильно.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 27 января 2011

Каждый из ваших операторов обновления в foreach каждый раз действует на одну и ту же строку или набор строк.В вашем примере вы используете «где столбец =« что-то »».Если это не меняется с каждой итерацией цикла foreach, вы будете обновлять одни и те же строки.

2 голосов
/ 27 января 2011

Измените ли вы where заявление в реальном коде?Теперь вы перезаписываете каждую строку, где столбец = 'что-то', что означает, что каждая строка будет обновляться каждый раз и в итоге получит одинаковое содержимое.

РЕДАКТИРОВАТЬ: Ответ на комментарий

Ну, для этого вам нужно нестатическое WHERE заявление.Вы можете сделать что-то вроде редактирования в моем посте ...

$a = array('1' => 'something1', '2' => 'something2', '3' => 'something3');

foreach($a as $id => $where){
    mysql_query("UPDATE table SET id = '$id' WHERE column = '$where'") or die(mysql_error());
}
0 голосов
/ 27 января 2011

Я не вижу, чтобы условие 'where' изменялось в цикле. Каждый раз, когда вы делаете «ГДЕ столбец =« что-то »», он будет совпадать и заменять ВСЕ строки, перезаписывая идентификатор каждого предыдущего обновления.

UPDATE:

Некоторые из нас написали похожие ответы одновременно. Я должен был нажать «обновить» еще раз, прежде чем «добавить»

Для чего стоит, если это одноразовое исправление для получения последовательных идентификаторов на столе, вы можете сделать это с помощью простого mysql:

mysql> select * from foo;
+------+------+
| id   | name |
+------+------+
|    0 | aaa  |
|    0 | bbb  |
|    0 | ccc  |
|    0 | ddd  |
+------+------+
4 rows in set (0.00 sec)

mysql> set @ct=0;
Query OK, 0 rows affected (0.00 sec)

mysql> update foo set id=(@ct:=@ct+1);
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

mysql> select * from foo;
+------+------+
| id   | name |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
|    4 | ddd  |
+------+------+
4 rows in set (0.00 sec)

Используйте 'order by', если хотите, например:

mysql> update foo set id=(@ct:=@ct+1) order by name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...