如何使用函数从SQL查询为数组赋值

时间:2016-05-02 22:46:52

标签: php arrays function

我在创建PHP函数时遇到了一些问题,该函数可以根据SQL查询的结果为多维关联数组赋值。

我已经搜索了关于这个主题的一些其他问题,但我无法判断答案是否适用于我/如何应用于我。我的问题似乎比其他问题更简单。我不确定如何用文字解释它,所以我将尝试通过代码解释。

假设我有这个数据库,其中有几个表格,其中包含有关不同品种的狗的各种信息。高度,重量,颜色等50多列信息。我想根据不同的搜索条件从该数据库中提取5个特定品种,但我想将所有相同的列分配给数组变量。因此,我不是一遍又一遍地重复这些长while循环,而是想创建一个为我分配这些变量的函数。

示例

$sql1 -> //Query for German Shepherd info
$sql2 -> // Query for Golden Retriever info
$sql3 -> // Query for Poodle info
$sql4 -> //Query for Pit Bull info
$sql5 -> // Query for Bulldog info

$dogs = array(array()); // set up 2 level multi-array

漫长的过程(确实有用,虽然它是多余的)是通过不同的while循环分配值,并反复重复所有列。

while ($rows = $sql1->fetch(PDO::FETCH_ASSOC)){
$dogs[1]['breed_name'] = $rows['breed_name'];
$dogs[1]['height'] = $rows['height'];
$dogs[1]['weight'] = $rows['weight'];
$dogs[1]['country'] = $rows['country'];
$dogs[1]['function'] = $rows['function'];
etc .. etc .. etc..
}
while ($rows = $sql2->fetch(PDO::FETCH_ASSOC)){
$dogs[2]['breed_name'] = $rows['breed_name'];
$dogs[2]['height'] = $rows['height'];
$dogs[2]['weight'] = $rows['weight'];
$dogs[2]['country'] = $rows['country'];
$dogs[2]['function'] = $rows['function'];
etc .. etc .. etc..
}
while ($rows = $sql3->fetch(PDO::FETCH_ASSOC)){
$dogs[3]['breed_name'] = $rows['breed_name'];
$dogs[3]['height'] = $rows['height'];
$dogs[3]['weight'] = $rows['weight'];
$dogs[3]['country'] = $rows['country'];
$dogs[3]['function'] = $rows['function'];
etc .. etc .. etc..
}

我更愿意只根据需要编写一个我可以为每个品种调用的函数。然后我可以将该函数存储在我所包含的任何页面的外部函数页面上。它可以节省空间和精力。但我无法弄明白 HOW 这样做。它似乎应该很简单,但我似乎错过了一些东西。

到目前为止,我尝试了两种不同的方式,但都没有产生任何结果。

尝试1

//set up the function
function setDog($dogs, $d) {
$dogs[$d]['breed_name'] = $rows['breed_name'];
$dogs[$d]['height'] = $rows['height'];
$dogs[$d]['weight'] = $rows['weight'];
$dogs[$d]['country'] = $rows['country'];
$dogs[$d]['function'] = $rows['function'];
etc .. etc .. etc..
} 

//call the function
while ($rows = $sql1->fetch(PDO::FETCH_ASSOC){setDog($dogs, 1);}
while ($rows = $sql2->fetch(PDO::FETCH_ASSOC){setDog($dogs, 2);}
while ($rows = $sql3->fetch(PDO::FETCH_ASSOC){setDog($dogs, 3);}
while ($rows = $sql4->fetch(PDO::FETCH_ASSOC){setDog($dogs, 4);}
while ($rows = $sql5->fetch(PDO::FETCH_ASSOC){setDog($dogs, 5);}

但是这不起作用(没有为数组分配值),所以我尝试将其切换为

尝试2

//set the function
function setDog($dogs, $d, $sql){

while ($rows = $sql->fetch(PDO::FETCH_ASSOC)){
$dogs[$d]['breed_name'] = $rows['breed_name'];
$dogs[$d]['height'] = $rows['height'];
$dogs[$d]['weight'] = $rows['weight'];
$dogs[$d]['country'] = $rows['country'];
$dogs[$d]['function'] = $rows['function'];
etc .. etc .. etc..
}

}

//call the function
setDog($dogs, 1, $sql1);
setDog($dogs, 2, $sql2);
setDog($dogs, 3, $sql3);
setDog($dogs, 4, $sql4);
setDog($dogs, 5, $sql5);

第二个似乎最有可能工作,但它仍然没有在我的数组中设置任何值。我通过调用随机数组变量(height,country,breed_name)进行检查,它们都是空的。

echo $dogs[1]['breed_name'];

我觉得这样,或者非常类似的东西应该是可能的。这个概念看起来很简单,但我必须遗漏一些东西。任何人都可以帮我解决这个问题吗?

修改!!

我第一次搞砸了我的榜样。它应该包含$ d参数,但我只是复制并粘贴了一堆错误的代码。它现在应该修复。

1 个答案:

答案 0 :(得分:1)

要更改原始$dogs数组,您必须将其传递给函数by reference

#                ↓
function setDog( &$dogs, $d, $sql  )
{
    (...)
}

setDog( $dogs, 1, $sql1 );

不使用引用,您的函数会创建传递参数的副本,并且它可以在该副本上运行。

另请注意,您的函数执行while循环,但它将行值分配给同一个数组:

while ($rows = $sql->fetch(PDO::FETCH_ASSOC)){
    $dogs[$d]['breed_name'] = $rows['breed_name'];

如果您的查询只返回一行,您的函数将按预期工作,否则只会添加最后一行(对于每个调用)。

结束注释:您为数组键分配了相同的db字段名称,因此您可以这样做:

while ($rows = $sql->fetch(PDO::FETCH_ASSOC)){
    $dogs[$d] = $rows;
}

或者 - 如果查询只返回一行:

function setDog( &$dogs, $d, $sql  )
{
    $dogs[$d] = $sql->fetch( PDO::FETCH_ASSOC );
}

如您所见,如果查询只返回一行,您可以完全删除函数调用并直接在主代码中执行:

$dogs[1] = $sql1->fetch( PDO::FETCH_ASSOC );
$dogs[2] = $sql2->fetch( PDO::FETCH_ASSOC );
(...)