gpt4 book ai didi

php - PDO 在 for 循环中失去连接?

转载 作者:行者123 更新时间:2023-11-29 06:06:48 25 4
gpt4 key购买 nike

我有一个让我抓狂的问题,希望有人能提供帮助。我最近开始学习 mysql PDO,而不是旧方法。我已经组合了一个表单,将值放入数组中,然后在循环中处理它们。我在下面简化了它,向您展示我正在做什么,但问题是我让它在本地计算机上正常工作,但是当它实时加载时,我认为它在 for 循环期间以某种方式丢失了 mysql 连接。

表格如下:

<form method="post" action="next.php">
<table border="1" cellspacing="2" cellpadding="3" style="font-size: 11px; font-family: arial;">
<tr>
<td><input type="checkbox" onClick="toggle(this)" /><br/></td>
<td><b>Sub Service Code</b></td>
<td><b>Criteria Value</b></td>
<td><b>Criteria Value 2</b></td>
</tr>
<tr>
<td><input type="checkbox" name="ID[]" value="2" /></td>
<td>&nbsp;John</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td><input type="checkbox" name="ID[]" value="3" /></td>
<td>&nbsp;Paul</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td><input type="checkbox" name="ID[]" value="4"checked /></td>
<td>&nbsp;Mary</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</table>
<input type="submit" value="Submit" name="next">
</form>

我用来处理此表单的 php 脚本如下所示:

<?php
if (isset($_POST['next'])) {
?>
<form method="post" action="next-2.php">
<table border="1" cellspacing="2" cellpadding="3" style="font-size: 11px; font-family: arial;">
<tr>
<td><input type="checkbox" onClick="toggle(this)" /><br/></td>
<td><b>Name</b></td>
<td><b>Value</b></td>
<td><b>Value 2</b></td>
<td><b>Select # of Levels</b></td>
</tr>

<?php
$id = $_POST['ID'];
if (empty($id)) {
echo("<p>You didn't select any names.</p>");
} else {
$N = count($id);
echo("<p>You selected $N names(s):</p>");
for($i=0; $i < $N; $i++) {
//echo($id[$i] . " ");
$stmt = $db->query('SELECT * FROM services_main');
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

if ($row['ID'] == $id[$i]) {

echo '
<tr>
<td><input type="checkbox" name="ID[]" value="'.$row['ID'].'" checked /></td>
<td>&nbsp;'.$row['Name'].'</td>
<td>&nbsp;'.$row['Value'].'</td>
<td>&nbsp;'.$row['Value 2'].'</td>
<td>
<select name="rate_'.$row['ID'].'" >
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
</td>
</tr>';
}
}
}
}
}
?>
</table>
<input type="submit" value="Submit" name="next-2">
</form>

在非本地环境中,我得到以下结果:

<form method="post" action="next-2.php">
<table border="1" cellspacing="2" cellpadding="3" style="font-size: 11px; font-family: arial;">
<tr>
<td><input type="checkbox" onClick="toggle(this)" /><br/></td>
<td><b>Name</b></td>
<td><b>Value</b></td>
<td><b>Value 2</b></td>
<td><b>Select # of Levels</b></td>
</tr>
<p>You selected 3 names(s):</p>
<tr>
<td><input type="checkbox" name="ID[]" value="2" checked /></td>
<td>&nbsp;John</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>
<select name="rate_2" >
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
</td>
</tr>
</table>
<input type="submit" value="Submit" name="next-2">
</form>

我认为它可能会丢失数据库连接的原因是因为我将其设置为“您选择了$N名称”并且它正确地显示了N值3,这意味着它应该循环查询数据库3次每个名称的三个 ID 值中每一个的时间。同样,它在我的本地环境中运行得非常好,但在实时服务器上却不行。我不明白为什么它只给我返回第一个名字结果 (John),而不返回实时环境中的其他两个结果。

最后,在我的每个页面上,我都包含以下数据库连接文件

$db = new PDO('mysql:host=sitename.org;dbname=name;charset=UTF-8', 'user', 'pwd');

我希望我已经足够彻底地解释了这个问题,我猜这可能是我忽略的一些简单的事情。感谢您的浏览...

最佳答案

好吧,首先,你不需要逐条比较记录来找出你想要的结果,只需使用MySQL WHERE来调节你的结果。其他问题是关于结构的,你不能添加 <p>元素进入 <table> .

所以,我要做的是检查 $_POST['ID']设置,然后检查这个变量是否是一个数组。然后我转义了 $_POST['ID'] 的所有值然后将数组内爆到 SQL。

注意:在 SQL 中,我仅选择了您的代码请求的字段。

所以,这段代码应该可以工作:

<?php
if (isset($_POST['next'])) {
?>
<form method="post" action="next-2.php">
<table border="1" cellspacing="2" cellpadding="3" style="font-size: 11px; font-family: arial;">
<tr>
<td><input type="checkbox" onClick="toggle(this)" /><br/></td>
<td><b>Name</b></td>
<td><b>Value</b></td>
<td><b>Value 2</b></td>
<td><b>Select # of Levels</b></td>
</tr>

<?php
// Check the existence of the "$_POST['ID']" and check if this is a array
if (isset($_POST['ID']) && is_array($_POST['ID']) {
$id = $_POST['ID'];
// Here we can't add '<p>' element to the table, so I used '<tr>'
echo '<tr><td colspan="5">You selected ' . count($id) . 'names(s):</td></tr>';

// Create a function to escape the value.
function escape($value) {
// Only integer value can be returned.
return (int) $value;
}

// Escaping '$id' values.
$id = array_map('escape', $id);

// SQL, here we implode all value to the condition.
$stmt = $db->query('SELECT `ID`, `Name`, `Value`, `Value 2` FROM `services_main` WHERE `ID` IN (' . implode(',', $id) . ')');

// Loop all results
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo '
<tr>
<td><input type="checkbox" name="ID[]" value="' . $row['ID'] . '" checked /></td>
<td>&nbsp;' . $row['Name'] . '</td>
<td>&nbsp;' . $row['Value'] . '</td>
<td>&nbsp;' . $row['Value 2'] . '</td>
<td>
<select name="rate_' . $row['ID'] . '" >
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
</td>
</tr>';
}

unset($stmt, $id);
} else {
// Here we can't add '<p>' element to the table, so I used '<tr>'
echo '<tr><td colspan="5">You didn\'t select any names.</td></tr>';
}
}
?>
</table>
<input type="submit" value="Submit" name="next-2">
</form>

关于php - PDO 在 for 循环中失去连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11195218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com