2015-08-06 6 views
1

Я пытаюсь различные пути для обхода через процедуру вызова запроса MySQL (ПДО)цикл через обновление п.д.о. запроса, где идентификатор

В следующем примере я обновление один столбец в таблице/базе данных. Данные $ _POST передаются через HTML-таблицу внутри формы.

Я планирую сделать формы и цикл несколько других «табличные данные», хотя процедуры MySQL вызова с более чем одной колонки обновляться

Все запросы обновления будут основаны на WHERE ID = $id

Я сделал что-то подобное в школе с помощью вложенного цикла Еогеаспа, но я где-то читал, что вложенный цикл просмотр следует избегать при размещении данных в MySQL

  • что является лучшим методом в этой ситуации с массами табличных данных для обновления через свой идентификатор первичного ключа?

  • Можно ли делать массовые запросы по MySql, и если да, то
    какие циклы лучше всего использовать здесь? В то время как против Foreach, For, Do и т. Д.?

  • И тогда что лучше всего здесь bindParam vs bindValue, заполнители? vs имя и т. д.?


/* Call up data based on some criteria while loop fetch it etc */ 

while($row = $stmt->fetch(PDO::FETCH_ASSOC)) // Works and echoes some tabular data O.K 

/* Snippet of the POST data concerned */ 
<td> 
    <input type="text" name="allocate[]"> 
    <input type="hidden" name="id[]" value="<?php echo $ID; ?>"> 
</td> 


/* Echoes something of the following HTML table inside form O.K */ 

<tr> 
    <td><input type="text" name="allocate[]"><input type="hidden" name="id[]" value="1244"></td> 
    <td>echo stuff</td> 
    <td>echo unrelated</td> 
</tr> 
<tr> 
    <td><input type="text" name="allocate[]"><input type="hidden" name="id[]" value="1255"></td> 
    <td>echo stuff</td> 
    <td>echo unrelated</td> 
</tr> 
<tr> 
    <td><input type="text" name="allocate[]"><input type="hidden" name="id[]" value="1399"></td> 
    <td>echo stuff</td> 
    <td>echo unrelated</td> 
</tr> 

/* The submitted form part */ 
<?php 

$db = DBConn::getConnection(); // config files etc etc 

if (isset($_POST['id']) && isset($_POST['allocate'])) { // works 

    // NOTE: no validation required for trusted "In-house" data entry 

    /* Simple method/varibles OR ?? */ 
    $id = $_POST['id']; 
    $allot = $_POST['allocate']; 

    /* OR ?? implode and explode array etc etc version-method (execute(array(.. ?? */ 

    $id = explode(",",$_POST['id']); 
    $allot = explode(",",$_POST['allocate']); 

    /* The Update Query */ 

    //$sql = "UPDATE propertyStats SET allot = :allot WHERE ps_id = :ps_id"; 
    //$sql = "UPDATE propertyStats SET allot = ? WHERE ps_id = ?"; 

    $sql = 'CALL updatePropSat(?,?)'; // Call procedure tested & works OK in phpMyAdmin 

    $stmt = $db->prepare($sql); 


    /* executing in an array rather foreach loop method? */ 
    $stmt->execute(array($allot, $id)); 


    /* FOREACH ATTEMPT /* NOTE: Form HTML was different to above HTML example */ 

    foreach ($_POST['allocate'] as $ids => $value) { 

     $sql = 'CALL updatePropSat(?,?)'; 

     $stmt = $db->prepare($sql); 

     $stmt->bindValue(1, $value, PDO::PARAM_STR); 
     $stmt->bindValue(2, $ids, PDO::PARAM_INT); 


     $stmt->execute(); 

     /* OR ALTERNATELY ?? */ 
     $stmt->execute(array($allot, $id)); 

    } 

    /* WHILE LOOP ATTEMPT (a flop I can few)*/ 

    $loopit = count($id); // did return correct number rows in the table/form 

    $i = 0; 
    while($i < $loopit) { 

     $stmt->bindParam(':allot', $allot[$i]); 
     $stmt->bindParam(':ps_id', $id[$i]); 

     $stmt->execute(); 

     $i++; 
    } 

ответ

0

Каков наилучший способ в этой ситуации с массами табличных данных, которые будут обновляться через их первичного ключа ID?

Подготовлено утверждение. Важная часть состоит в том, чтобы подготовить их один раз за пределами цикла, а затем выполнить их внутри петля. В вашем Exemple, вы готовите его внутри цикла, который побеждает цель:

$stmt = $db->prepare('CALL updatePropSat(?,?)'); 
foreach ($_POST['allocate'] as $ids => $value) { 
    $stmt->execute([ 
     $value, 
     $ids, 
    ]); 
} 

нормально ли это сделать массивный цикл через запросов MySql, и если да , какие циклы лучше всего использовать здесь? В то время как против Foreach, For, Do и т. Д.?

Это зависит от данных по причине. Абсолютного ответа нет. Если вы держите свой prepare() вне цикла и execute() внутри них, все должно быть в порядке. В большинстве случаев я использую foreach, так как у меня редко хватает данных, чтобы превысить ограничение на память.

И тогда что лучше здесь bindParam vs bindValue, заполнители? vs name и т. д.?

Это вопрос предпочтения. Когда у меня есть много полей для изменения в одном запросе и их правильное упорядочение утомительно, я использую имена заполнителей. Но я очень предпочитаю позиционированные заполнители.

+0

Благодарим за ответ. Извинения за медленный ответ, как-то пропустили сообщение и были заняты. На данный момент все еще нова, Так или иначе, я сначала застрял. Квадратные скобки вернули ошибку. Итак, внутри foreach я попытался: $ stmt-> execute (array ($ allot, $ id)); Но тогда я должен был изменить название формы T0: 'code' <входной тип = "текст" название = "выделить [?]"> От: Вне курса Подготовить() вне цикла было ключом. Благодаря! – CCICT

+0

Однако это был только один столбец для обновления date - Мне интересно, как будет выглядеть много столбцов? Вложенные петли Foreach ??? (Надеюсь, нет) например. UPDATE tablename SET col1 = col1, col2 = col2, col3 = col3 (и т. Д.) WHERE id = id – CCICT

0

Я нахожу, что все ваши вопросы совершенно неактуальны.

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

Какие циклы лучше всего использовать здесь? В то время как против Foreach, For, Do и т. Д.?

Неприменимо. Нет «лучших петель».

Что лучше здесь bindParam vs bindValue, заполнители? vs name и т. д.?

Неприменимо. Они все равно.

ВЫЗОВ updatePropSat (?,?)

неуместны. Для выполнения простого обновления не требуется SP. Просто запустите свой запрос на обновление с помощью PDO


Теперь несколько советов.

Для вашего единичного значения заполнения своей формы, как этот

<td> 
    <input type="text" name="allocate[<?php=$ID?>]"> 
</td> 

И вы будете иметь возможность перебрать с помощью кода из другого ответа:

$stmt = $db->prepare('UPDATE propertyStats SET allot = ? WHERE ps_id = ?'); 
foreach ($_POST['allocate'] as $id => $value) { 
    $stmt->execute(array($value, $id)); 
} 

В то время как для множества значений, которые принадлежат к одному и тому же ряду

<td> 
    <input type="text" name="data[<?php=$ID?>][allocate]"> 
    <input type="text" name="data[<?php=$ID?>][foo]"> 
    <input type="text" name="data[<?php=$ID?>][bar]"> 
    <input type="text" name="data[<?php=$ID?>][id]"> 
</td> 

Таким образом, вы сможете полностью перебрать свои данные простой способ

$sql = "UPDATE t SET allocate = :allocate, foo = :foo, bar = :bar WHERE id = :id"; 
$stmt=$pdo->prepare($sql); 
foreach ($_POST['data'] as $row) 
{ 
    $stmt->execute($row); 
} 
Смежные вопросы