2013-09-16 9 views
-1

У меня есть таблица с более чем 70 столбцов, так как я могу сделать что-то вроде этого:Обновление нескольких столбцов с несколькими значениями в Msql

mysql_query("update `table` set (`column1`, `column2`, `column3`, `column4`, `column5`, ...`column100`) = ('val1', 'val2', 'val3', 'val4', 'val5', ...'val100') where `anycolumn`='anyvalue'"); 

Так что обрушится массив $ _POST вместо того, чтобы писать их один один:

mysql_query ("обновить table набор (column1, column2, column3, column4, column5, ... column100) = (" .implode ('', $ _ POST) "), где anycolumn = 'anyvalue. «");

+1

И вопрос ...? – raina77ow

+1

НЕ просто взорвать массив '$ _POST' и добавить его в свой запрос. Помимо очевидной возможности того, что вы включите данные в неподходящее место, вы полностью открываете атаку SQL Injection. –

+0

@ raina77ow, это не работает!: «update' clients' set ('name',' id_num') = ('123', '2317769756'), где id = '1' " – Samer

ответ

1

Вы можете использовать альтернативный формат для команды UPDATE

UPDATE table SET 
     column1 = 'value1', 
     column2 = 'value2', 
     : 
     column100 = 'value100'; 

Используя этот формат, можно построить код SQL в PHP. Для например: -

$updated_fields = array(); 
$sql = 'UPDATE table SET '; 
foreach ($_POST as $column => $field) { 
    if (isset($field) && strlen($field)) { 
     $updated_fields[] = "`".$column."` = '".mysql_real_escape_string($field)."'"; 
    } 
} 
$sql = implode(", ", $updated_fields)."WHERE somecondition = 'somevalue' "; 

Некоторые примечания

  • Этот код предполагает, что все ваши $ _POST переменные будут иметь соответствующий столбец базы данных.
  • Вам нужно будет заполнить условие после предложения WHERE.
  • Примите к сведению замечания по поводу инъекций SQL
  • использовать что-то вроде PDO, а не mysql_ * команды
+1

Спасибо, что это работает, но нуждается в небольших исправлениях: 1- $ updated_fields вместо $ update. 2- isset ($ field) && strlen ($ field) вместо isset ($ _ POST [$ field]) && strlen ($ _ POST [$ field]). 3- mysql_real_escape_string ($ field) вместо mysql_real_escape_string ($ _ POST [$ field]). – Samer

+0

Хорошо заметили @Samer. Исправленный. – crafter

1

Я исправил вашу синтаксическую ошибку в php, но запрос недействителен.

$query = "update table set (column1, column2, column3, column4, column5, ...column100) = ('".implode("','",$_POST)."') where anycolumn='anyvalue'"; 
echo $query; 

Попробуйте это решение с помощью ассоциативного массива:

<?php 

$_POST= array(0,1,2,3); 
$params=array(
'column1'=>$_POST['0'],'column2'=>$_POST['1'],'column3'=>$_POST['3'] 
); 

foreach($params as $key=>$value){ 
    $partQuery[]="$key = $value" ; 
} 
$query = "update table set(".implode(' , ',$partQuery).") where anycolumn='anyvalue'"; 
echo $query; 
?> 

Но обратите внимание на инъекции SQL, и попытайтесь использовать mysqli или PDO вместо mysql_ которая устарела и не будет поддерживаться больше в будущие версии php.

+0

Это 2013. Это PHP 5.5. Зачем использовать ** mysql _ **? –

+0

Зачем рассказывать это мне, я знаю, что это устарело, я просто исправляю его ошибки :), скажите, что для op –

+0

Вот почему нет нисходящего потока: p Но с большей вероятностью увидит предупреждение, если ответ содержит это древнее дерьмо: p –

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