PHP/MySQL : Declare variables using array elements from MySQL Query

标签 php mysql

我正在尝试从数据库中检索数据,并将数组元素分配给我希望在整个程序中使用的 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/

相关文章:

php - 具有大量列的 mysql 表的最佳方法

php - 计算总和值 jQuery PHP

php - 将数据库调用添加到 OO PHP 的最佳方法

php - JQuery 在 IE 8 或 7 中不起作用

php - 登录系统只接受访问数据库中的第一项

php - Mysql:LAST_INSERT_ID按预期工作(由我)?

MySQL:为什么是 varchar(254) 而不是 varchar(255)?

php - 显示来自 MySQL 数据库的日期

MySQL搜索匹配第一位长数字

php - HY000 - 2014 - 当其他未缓冲的查询处于事件状态时无法执行查询