2013-10-02 2 views
0

Какова наилучшая практика для перемещения нескольких операторов foreach в массив? Я повторяю этот процесс в своем коде, когда знаю, что есть лучший и быстрый способ сделать это. Возможно ли issetforeach? Я начинаю работать с PDO, как бы я сократил свой код ниже или переместил его в массив какого-то типа?Работа с foreach, issets, массивами?

if (isset($_POST['one'], $_POST['two'], $_POST['three'])) { 

    foreach($_POST['one'] as $id => $one) { 
     $sql = "UPDATE table SET one = ? WHERE id = ?"; 
     $q = $db->prepare($sql); 
     $q->execute(array($one, $id)); 
    } 

    foreach($_POST['two'] as $id => $two) { 
     $sql = "UPDATE table SET two = ? WHERE id = ?"; 
     $q = $db->prepare($sql); 
     $q->execute(array($two, $id)); 
    } 

    foreach($_POST['three'] as $id => $three) { 
     $sql = "UPDATE table SET three = ? WHERE id = ?"; 
     $q = $db->prepare($sql); 
     $q->execute(array($three, $id)); 
    } 
} 

РЕДАКТИРОВАТЬ: Пример HTML/PHP (INPUT TYPE = 'Текст') для более ясного примера:

$stmt = $db->query('SELECT * FROM table ORDER BY id '); 
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
echo " 
<input type='text' id='one' value='{$row['one']}' name = 'one[{$row['id']}]' /> 
<input type='text' id='two' value='{$row['two']}' name = 'two[{$row['id']}]' /> 
<input type='text' id='three' value='{$row['three']}' name = 'three[{$row['id']}]' />"; 
} 
+0

Какова структура ваших $ _POST? кажется, что вы можете сначала оптимизировать HTML-конец, потому что это выглядит немного странно. –

ответ

3

Предполагая, что все входы будут иметь одинаковые идентификаторы:

$sql = "UPDATE table set one = :one, two = :two, three = :three where id = :id"; 
$q = $db->prepare($sql); 
$q->bindParam(':one', $one); 
$q->bindParam(':two', $two); 
$q->bindParam(':three', $three); 
$q->bindParam(':id', $id); 
foreach ($_POST['one'] as $id => $one) { 
    $two = $_POST['two'][$id]; 
    $three = $_POST['three'][$id]; 
    $q->execute(); 
} 

Вы должны подготовить инструкцию только один раз, а не каждый раз через цикл. И используя bindParam, вы можете связать все параметры с ссылками на переменные. Затем вы можете установить все переменные в одном цикле и выполнить запрос с этими значениями.

+0

Легенда. Ты, мой друг, должен быть рыцарем! Я не ожидал бы чего-нибудь меньшего от человека бородатого человека! – SethCodes

0

Другой способ сделать это:

<?PHP 
foreach($_POST as $name => $value) { 
    if(isset($name,$value)){ 
     $sql = "UPDATE table SET $name = $value WHERE id = $name"; 
     $q->execute($db->prepare($sql)); 
    } 
} 
?> 

Если Вы отправляете другую информацию, тоже, вы можете переместить это в массив. Затем получите

foreach($_POST[fieldsToUpdate] as $name => $value) { 

Дайте мне знать, если у вас есть дополнительные вопросы.

+0

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

+0

Вопрос заключался не в том, как сделать его безопасным, а в том, как быстро прокручивать через входы POST. Я предполагаю, что входы очищены и защищены должным образом либо сразу после POST, либо перед вставкой в ​​БД. – Andre

+0

Это ваша проблема –

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