PHP / MySQL:使用MySQL Query中的数组元素声明变量

时间:2014-09-01 02:28:11

标签: 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当前为空。这是一个简单的编码错误吗?

3 个答案:

答案 0 :(得分:3)

由于您的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];
}

可是...

尽管如此,在PHP中使用递增for循环并不常见。 foreach几乎总是首选。如果你真的必须填充这些局部变量而不是直接从我们之前填充的$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)

答案 1 :(得分:1)

将任务存储为数组。试试这个代码 - 未经测试且免费保修,但非常简单。

$tasks = [];  // array to store tasks

while($tasks_displayed = $tasks_result->fetch_array()) {  // could use fetch_row instead?

    $tasks[] = $tasks_displayed[0];

}

var_dump($tasks);

答案 2 :(得分:1)

这不是您问题的答案,而是您概述的问题的另一种方法

// 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


$tasks_displayed = $tasks_result->fetch_array();

foreach( $tasks_displayed as $key => $value )
{
    echo "Task ".($key + 1)." from array: " . $value . "<br>";
}