我试图从我的数据库中循环一些数据,但它输出两次。
$fields = 'field1, field2, field3, field4';
$idFields = 'id_field1, id_field2, id_field3, id_field4';
$tables = 'table1, table2, table3, table4';
$table = explode(', ', $tables);
$field = explode(', ', $fields);
$id = explode(', ', $idFields);
$str = 'Egg';
$i=0;
while ($i<4) {
$f = $field[$i];
$idd = $id[$i];
$sql = $writeConn->select()->from($table[$i], array($f, $idd))->where($f . " LIKE ?", '%' . $str . '%');
$string = '<a title="' . $str . '" href="' . $currentProductUrl . '">' . $str . '</a>';
$result = $writeConn->fetchAssoc($sql);
foreach ($result as $row) {
echo 'Success! Found ' . $str . ' in ' . $f . '. ID: ' . $row[$idd] . '.<br>';
}
$i++;
}
对外输出:
成功!在field3中找到了蛋。 ID:5 成功!在field3中找到了蛋。 ID:5。
有人可以解释为什么它循环索引和 关联值?
更新
我做了一些游戏,并尝试了以下内容。
$fields = 'field1, field2, field3, field4';
$idFields = 'id_field1, id_field2, id_field3, id_field4';
$tables = 'table1, table2, table3, table4';
$table = explode(', ', $tables);
$field = explode(', ', $fields);
$id = explode(', ', $idFields);
$str = 'Egg';
$i=0;
while ($i<4) {
$f = $field[$i];
$idd = $id[$i];
$sql = $writeConn->select()->from($table[$i], array($f, $idd))->where($f . " LIKE ?", '%' . $str . '%');
$string = '<a title="' . $str . '" href="' . $currentProductUrl . '">' . $str . '</a>';
$sth = $writeConn->prepare($sql);
$sth->execute();
$result = $sth->fetch(PDO::FETCH_ASSOC);
foreach ($result as $row) {
echo 'Success! Found ' . $str . ' in ' . $f . '. ID: ' . $row[$idd] . '.<br>';
}
$i++;
}
有趣的是,这输出如下:
成功!在field3中找到了蛋。 ID:E。
成功!在field3中找到了蛋。 ID:E。
成功!在field3中找到了蛋。 ID:5 成功!在field3中找到了蛋。 ID:5 成功!在field3中找到了蛋。 ID:E。
成功!在field3中找到了蛋。 ID:E。
成功!在field3中找到了蛋。 ID:5 成功!在field3中找到了蛋。 ID:5。
我还尝试将$i
添加到输出中,并按预期输出2
。
如果我将fetch(PDO::FETCH_BOTH)
更改为fetch(PDO::FETCH_ASSOC)
,则输出如下:
成功!在field3中找到了蛋。 ID:E。
成功!在field3中找到了蛋。 ID:E。
成功!在field3中找到了蛋。 ID:5 成功!在field3中找到了蛋。 ID:5。
这一直困扰着我,所以如果有人能提供帮助,我会非常感激!
答案 0 :(得分:1)
可能fetchAssoc()
返回一个包含数字(0~n)和字符串(列名)键的数组。请参阅PDOStatement::fetch()文档页面上的PDO::FETCH_BOTH
。
添加:原因与fetchAssoc()
默认返回双数组的原因相同:PHP不区分数字和字符串索引数组;这取决于你使用它们。
答案 1 :(得分:0)
忘记所有复杂的解释。您的问题是由在该循环中使用echo()引起的。我有同样的问题(见下文),其中foreach循环运行两次没有明显的原因。
如果您想从PHP代码中提供信息以进行测试,请创建一个文本字符串并向其中添加内容,如:
$result .= "<br>And then this thingy did those stuff";
如果您这样做并且只在流程结束时回显$ result,您会发现问题已经消失。
echo()函数以一种量子的方式混淆了PHP的成就感:你让它感觉它已经同时已经完成了运行你的代码,并且还没有开始。我无法解释细节,但结果非常夸张。
我的问题是: 我对foreach的不同设置有同样的问题。在我的例子中,数组来自HTTP请求URL:
// myfakeserver /功能/ dealWithIncomes.php I = {%220%22:{%22 amount%22:332,%22T1%22:%22month%22,%22M1%22:1,%22T2%22 :%22dayofmonth%22%22M2%22:20,%22T3%22:%22%22%22M3%22:0,%22S1%22:%22%22%22E1%22:%22%22} ,%221%22:{%22 amount%22:444,%22T1%22:%22week%22,%22M1%22:1,%22T2%22:%22dayofweek%22,%22M2%22:1,%22T3 %22:%22%22%22M3%22:0,%22S1%22:%22%22%22E1%22:%22%22},%222%22:{%22 amount%22:443,% 22T1%22:%22年%22%22M1%22:1,%部22t2%22:%22%22%22M2%22:0,%22T3%22:%22%22%22M3%22:0, %22S1%22:%222012-02-29%22%22E1%22:%22%22}}
$ incomes = json_decode($ _ GET ['i'],true);
换句话说,一个JSON字符串代表三个收入及其属性,如金额和重复模式。
PHP非常清楚地将此字符串理解为数组:sizeof($ incomes)返回3.
但是当我循环这件事......
foreach($ income as $ income){ $ result。=“从长度数组处理一个收入”。的sizeof($收入); }
......我明白了...... “处理长度为3的阵列中的一个收入” “处理长度为3的阵列中的一个收入” “处理长度为3的阵列中的一个收入” “处理长度为3的阵列中的一个收入” “处理长度为3的阵列中的一个收入” “处理长度为3的阵列中的一个收入”