我在创建一个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..
}
我更愿意只写一个函数,我可以根据需要为每个品种调用它。然后我可以将函数存储在一个外部函数页面上,我可以将其包含在我正在处理的任何页面中。这将节省空间和精力。但我不知道如何这样做。这似乎应该很简单,但我似乎错过了一些东西。
到目前为止,我已经尝试了两种不同的方法,都没有产生任何结果。
尝试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参数,但我只是复制并粘贴了一堆错误的代码。现在应该修复它。
要更改原始$dogs
数组,必须通过引用将其传递给函数:
# ↓
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 );
(...)