我试图从数据库中检索数据,并将数组元素分配给希望在整个程序中使用的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
访存循环中,并且您正在使用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
几乎总是p首选。如果您确实必须填充这些局部变量,而不是直接从$tasks
我们先前填充的数组中直接使用它们,请使用foreach
:
foreach ($tasks as $key => $task) {
${'line'.($key + 1)} = $tasks[$key];
}
实际上,最常规的做法是将任务保留在循环$tasks
内部创建的数组中,while
而不是填充可能未知的变量数量,而不必将它们添加到局部或全局符号表中。如果任务是相关的(可以说是简单的,因为它们都是任务),那么将它们绑定在一个数组中是明智的。
// 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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句