我正在尝试从数据库中检索数据,并将数组元素分配给我希望在整个程序中使用的 PHP 变量,这样我就不必担心稍后发布单独的表单数据。
我知道我当前设置的查询当前在之前的测试中正在运行,但是当我尝试使用 FOR 循环输出我从 MySQL 查询结果分配的变量时,仅显示数据库中的第一个元素。
PHP/MySQL 代码:
// Retrieve tasks from the tasks table
$tasks_sql = "SELECT DISTINCT taskname FROM tasks";
$tasks_result = mysqli_query($usermysqli, $tasks_sql);
if (! $tasks_result){
die('Could not retrieve data: ' . mysql.error());
}
// Array for assigning tasknames to global variables
while($tasks_displayed = $tasks_result->fetch_array()) {
for ($i=0, $inputlen = count($tasks_displayed); $i < $inputlen; $i++) {
${'line'.($i+1)} = $tasks_displayed[$i];
}
}
// Test to see if the array above actually worked.
echo "Task 1 from array: " . $line1 . "<br>";
echo "Task 2 from array: " . $line2 . "<br>";
echo "Task 3 from array: " . $line3 . "<br>";
echo "Task 4 from array: " . $line4 . "<br>";
echo "Task 5 from array: " . $line5 . "<br>";
echo "Task 6 from array: " . $line6 . "<br>";
仅第一个元素正确显示,变量 $line2 - $line6 当前为空。这是一个简单的编码错误吗?
最佳答案
由于您的 for
循环嵌套在您的 while
fetch 循环中并且,您正在使用 for
循环来填充各个变量,在每次循环迭代中,您将覆盖相同的变量。换句话说,每次获取时,您都会返回一个包含 1 行、1 个元素的数组。然后,for
循环一次又一次地遍历该单行并仅填充第一个变量。
一旦所有行都已提取到数组中,for
循环需要在 while
循环之后发生。
// Fetch an associative array
// array to hold all tasks
$tasks = array();
// Also, consider sticking with the procedural method since that's what you use elsewhere
while ($tasks_displayed = $tasks_result->fetch_assoc()) {
// procedural alternate:
// while ($tasks_displayed = mysqli_fetch_assoc($tasks_result)) {
// Append the task onto your array
$tasks[] = $tasks_displayed['taskname'];
}
// Following the loop you now have an array of tasks.
// you can use a for loop to display them:
$tasklength = count($tasks);
for ($i = 0; $i < $tasks; $i++) {
// Populate your variables...
${'line'.($i+1)} = $tasks[$i];
}
但是...
也就是说,递增的 for
循环在 PHP 中确实很少使用。 foreach
几乎总是首选。如果您确实必须填充这些局部变量,而不是直接从我们之前填充的 $tasks
数组中使用它们,请使用 foreach
:
foreach ($tasks as $key => $task) {
${'line'.($key + 1)} = $tasks[$key];
}
实际上,这里最传统的做法就是将任务保留在 while
循环内创建的 $tasks
数组中,而不是填充可能未知的数字变量,不必要地将它们添加到本地或全局符号表中。如果任务是相关的(可以说它们是相关的,因为它们都是任务),那么明智的做法是将它们绑定(bind)在一个数组中。
// Use $tasks as an array, don't populate variables:
foreach ($tasks as $key => $task) {
echo "Task $key from array: $task<br/>\n";
}
如评论中所述,请注意将 mysql_*()
与 mysqli_*()
API 混淆。您对 mysql_error()
的调用应该改为对 mysqli_error($usermysqli)
关于PHP/MySQL : Declare variables using array elements from MySQL Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25598132/