我正在尝试各种方法来遍历MySQL调用过程查询(PDO)
在以下示例中,我正在更新表/数据库中的一列。通过表格内的HTML表格提交的$ _POST数据。
我打算做一些其他的'表格数据'表格并循环通过MySQL调用程序,有多个列要更新
所有更新查询都将基于WHERE ID = $id
我在学校里使用嵌套的foreach循环做了类似的事情,但我在某处读到了将数据发布到mysql时应该避免嵌套的foreach循环
在这种情况下,具有大量表格数据的最佳方法是什么 要通过主键ID更新?
可以通过MySql查询进行大量循环,如果是这样的话 哪个循环最好用在这里?虽然vs Foreach,For,Do等?
然后这里最好的是bindParam与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 :(得分:0)
在这种情况下,通过主键ID更新大量表格数据的最佳方法是什么?
准备好的声明。重要的一点是在循环之外准备一次,然后在循环中执行 。在你的例子中,你正在循环中准备它,这违背了目的:
$stmt = $db->prepare('CALL updatePropSat(?,?)');
foreach ($_POST['allocate'] as $ids => $value) {
$stmt->execute([
$value,
$ids,
]);
}
可以通过MySql查询进行大量循环,如果可以的话 哪个循环最好用在这里?虽然vs Foreach,For,Do等?。
这取决于原因的数据。没有绝对的答案。如果你将prepare()
置于循环之外并将execute()
置于其中,则应该没问题。我大部分时间都使用foreach,因为我很少有足够的数据来超出内存限制。
那么bindParam与bindValue,占位符最好的是什么? vs名字等?
这是一个偏好问题。当我在一个查询中有很多字段需要更改并按正确顺序排列时,我会使用命名占位符。但我非常喜欢定位占位符。
答案 1 :(得分:0)
我发现你的所有问题都是无关紧要的。
我可以从你的问题中提取的唯一问题是嵌套的foreach循环。我能想到的唯一一个这样的循环是一次更新同一行的列而不是每个查询一个。这个问题与PDO或其他什么&#34;最佳方法无关。它是普通的旧SQL。您必须在一个查询中更新同一行中的所有列。因此,您不需要嵌套的foreach来运行查询。
这里最好使用哪些循环?虽然vs Foreach,For,Do等?。
无关。没有&#34;最好的循环&#34;。
这里最好的是bindParam与bindValue,占位符? vs名字等?
无关。他们都一样。
CALL 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);
}