大家好! 我是编码的新手,将在明年9月上课。期待那....: - )
我正在为我的数据库做一个修改页面。它由输入和下拉列表组成,用于修改DB的内容。至少现在......直到我了解更多。
我为自己编码,并想知道以下是否是正确的方法?在我看来它不是,因为内部查询在每次外循环通过时都会被执行......但它有效!?!?
这是我能找到使内部FOREACH循环( $ familylist )与Mysql查询一起工作的唯一方法。如果内循环的查询在外循环之外( $ plantList )......它不起作用。第一个下拉列表将填充内容,但以下行不会,至少只有第一个选项,它不会填充查询中的内容。
欢迎任何帮助和赞赏!
<?php //more code here....
$plantQuery = "SELECT id, genre, espece, famille FROM plante ORDER BY genre";
$plantList = $dbconnect->query ($plantQuery);
?>
<table>
<thead>
<tr>
<th>ID</th>
<th>GENRE</th>
<th>ESPÈCE</th>
<th>FAMILLE</th>
</tr>
</thead>
<tbody>
<?php foreach ($plantList->fetchAll(PDO::FETCH_ASSOC) as $plant) : ?>
<form method="post">
<tr>
<td><input name="id" value="<?php echo $plant["id"] ;?>" readonly></td>
<td><input name="genre" value="<?php echo $plant["genre"] ;?>"></td>
<td><input name="espece" value="<?php echo $plant["espece"] ;?>"></td>
<td><select name="familleList" >
<option value="0" >Choisir une famille</option>
<?php
$familyQuery = "SELECT id, famille FROM famille ORDER BY id ASC";
$familyList = $dbconnect->query ($familyQuery);
?>
<?php foreach ($familyList->fetchAll(PDO::FETCH_ASSOC) as $family):?>
<option value="<?php echo $family["id"] ;?>" <?php if ($plant["famille"] <> 0 && $plant["famille"] == $family["id"] ) {echo "selected"; }?>><?php echo $family["id"] . " - " . $family["famille"] ;?></option>
<?php endforeach ;?>
</select>
</td>
<td><button name="modifier" type="submit">Modifier</button></td>
<td><button name="supprimer" type="submit">Supprimer</button></td>
</tr>
</form>
<?php endforeach ;?>
</tbody>
</table>
答案 0 :(得分:0)
你是对的。你在做什么是非常低效的。数据库查询往往会产生瓶颈,因此最小化它们通常是最好的做法。
由于您没有将任何值传递给第二个查询,只需将其从循环中取出:
<?php //more code here....
$plantQuery = "SELECT id, genre, espece, famille FROM plante ORDER BY genre";
$plantList = $dbconnect->query ($plantQuery);
$familyQuery = "SELECT id, famille FROM famille ORDER BY id ASC";
$familyList = $dbconnect->query ($familyQuery);
?>
<table>
<thead>
<tr>
<th>ID</th>
<th>GENRE</th>
<th>ESPÈCE</th>
<th>FAMILLE</th>
</tr>
</thead>
<tbody>
<?php foreach ($plantList->fetchAll(PDO::FETCH_ASSOC) as $plant) : ?>
<form method="post">
<tr>
<td><input name="id" value="<?php echo $plant["id"] ;?>" readonly></td>
<td><input name="genre" value="<?php echo $plant["genre"] ;?>"></td>
<td><input name="espece" value="<?php echo $plant["espece"] ;?>"></td>
<td><select name="familleList" >
<option value="0" >Choisir une famille</option>
<?php
?>
<?php foreach ($familyList as $family):?>
<option value="<?php echo $family["id"] ;?>" <?php if ($plant["famille"] <> 0 && $plant["famille"] == $family["id"] ) {echo "selected"; }?>><?php echo $family["id"] . " - " . $family["famille"] ;?></option>
<?php endforeach ;?>
</select>
</td>
<td><button name="modifier" type="submit">Modifier</button></td>
<td><button name="supprimer" type="submit">Supprimer</button></td>
</tr>
</form>
<?php endforeach ;?>
</tbody>
</table>
即使这不是这种情况,每当您多次执行相同的查询而只更改变量时,您可以使用预准备语句:
$familyQuery = $dbconnect->prepare("SELECT * FROM famille
WHERE something = :s
AND somethingelse = :se ORDER BY id ASC");
foreach ($values as $val) {
$familyQuery->bindValue('s', $val);
$familyQuery->bindValue('se', somefunction($val));
$familyQuery->execute();
$results = $familyQuery->fetchAll();
// Do something with the results
}
这种方式首先将查询发送到数据库服务器,并且所有值都是单独发送的。
答案 1 :(得分:0)
而不是多次调用数据库,而不是loop
内的相同数据。一个简单的解决方案就是调用一次。在文件的顶部做这样的事情。
$families = $familyList->fetchAll(PDO::FETCH_ASSOC);
然后你可以将你的foreach
循环到。
foreach ($families as $family)
这将使查询执行一次,从而避免对database
进行多次查询。并且loop
覆盖loops
。