PHP PDO 多个查询是不好的做法?

Posted

技术标签:

【中文标题】PHP PDO 多个查询是不好的做法?【英文标题】:PHP PDO Multiple queries is Bad Practice? 【发布时间】:2016-11-23 00:10:47 【问题描述】:

我在一个网站上工作,我需要用类别填充一些字段,所以现在我多次查询数据库:

$dataCat=new database_data();
$a=$dataCat->query_fecthAll("SELECT name,value,id FROM categories.categories WHERE categories.value LIKE ? ORDER BY id ASC",array('1'));

$b=$dataCat->query_fecthAll("SELECT name,value,id FROM categories.categories WHERE categories.value LIKE ? ORDER BY id ASC",array('2'));

$c=$dataCat->query_fecthAll("SELECT name,value,id FROM categories.categories WHERE categories.value LIKE ? ORDER BY id ASC",array('3'));

$d=$dataCat->query_fecthAll("SELECT name,value,id FROM categories.categories WHERE categories.value LIKE ? ORDER BY id ASC",array('4'));

$e=$dataCat->query_fecthAll("SELECT name,value,id FROM categories.categories WHERE categories.value LIKE ? ORDER BY id ASC",array('5'));

我得到了预期的一切,然后我使用复选框、单选、选择等上的值,例如:

echo '<select><option value="">tipo de inmueble</option>';
                            foreach($b as $x)
                                echo '<option value="'.$x['id'].'">'.ucwords($x['name']).'</option>';
                            
                            echo '</select>';

在 1 个页面上,我需要填充 5 个以上的字段,在我看来,多重查询不是可行的方法,所以我继续尝试了一些不同的查询,如下所示:

SELECT value, json_agg(id || ',' || name), json_agg(concat(id,' => ',quote_literal(name))) FROM categories.categories WHERE categories.value != 'null' GROUP BY value ORDER BY value ASC

我的目标是获取带有数组的表,但是填充我需要的字段很痛苦,我对分层查询很困难,但我不知道如何将结果的一部分用于我需要的部分.假设我从查询中得到 30 个结果,如何使用前 3 行填充第一个表单元素,然后使用另一部分填充第二个表单元素等等。

我的问题:可行吗?我应该坚持多个查询吗?会影响性能吗?还有其他方法可以去这里吗?

提前感谢您的任何指点。

更新

好的,我现在开始工作了,这是查询:

$query=$dataCat->query_fecthAll("SELECT value,array_agg(id) as id,array_agg(name) as name FROM categories.categories WHERE categories.value != ? GROUP BY value ORDER BY value ASC",array('null'));

然后我用 php 处理结果,名称列有不同的长度,所以我循环了一下:

$strToRep=array('','');
for( $i= 0 ; $i < count($query) ; $i++ )

    //Clean the Array results
    $cleanId=str_replace($strToRep,'',$query[$i]['id']);
    $cleanName=str_replace($strToRep,'',$query[$i]['name']);

    //Create Arrays for ID and Name
    $a=explode(',',$cleanId);
    $b=explode(',',$cleanName);

    //Combine them into one array
    $newArray[] = array_combine($a, $b);

    //reorder the array in the desire way (alphabetical ASC by value)
    asort($newArray[$i]);
    ;

    //test it!
    print_r($newArray);

    //Use it!
    echo '<select required><option value="">tipo de negociacion</option>';
        foreach($newArray[0] as $key => $x)
            echo '<option value="'.$key.'">'.ucwords($x).'</option>';
        
        echo '</select>';

一切看起来都不错,现在我在 chrome 上对其进行了测试,我得到了这个(我不确定这是否是了解哪个性能更好的最佳方法,第一次在这里测试性能......):

【问题讨论】:

测量它并判断它是否符合您的性能需求/要求。如果是这样 - 你很好。 为什么不使用LIKE ANY (?) 进行单个查询,然后将类别包含在您的SELECT 中? 表格不是那么长,最多有 150 行,但我的问题是我找不到缩小任何特定选择或复选框结果的方法,我将使用任何检查选择看看我能做什么 【参考方案1】:

这是不好的做法,因为代码重复太多。

如果这样做更快,那么执行多个查询是合理的,但通常情况并非如此。 (你需要用相当大的数据集来衡量它,)

您总是可以在查询后将数据分成合适的块:

$elements = [1, 2, 3];

$result = $dataCat->query_fecthAll('SELECT name, value, id FROM categories.categories '
        . 'WHERE categories.value IN (?' . str_repeat(', ?', count($elements) - 1)
        . ') ORDER BY id ASC', $elements);

$fields = [];
foreach ($result as $item) 
    $fields[$item['value']][] = $item;


// rendering elements could also be in a loop 
// but you probably need more data for element i.e name, type, ...
foreach ($elements as $elem) 
    echo renderElement($fields[$elem]);

【讨论】:

是的,这就是我的难处,重复太多,我只需要循环后的名称和ID,我今天将测试这段代码,看看它是如何运行的,这仍然是多个查询对吗? 我的示例总共只使用了 1 个查询 我现在明白了,我觉得它就像一个循环,但它只是重复 $elements,非常好,我会将此作为答案,谢谢您的帮助。

以上是关于PHP PDO 多个查询是不好的做法?的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中使用多个数据库进行 PDO 连接查询

使用 PDO 在 php 中的多个查询与单个查询?

SQL-'08:多个 Replace 语句是一种不好的做法/是不是有另一种方法来编写此查询?

PHP Mysql PDO查询来自foreach存储的多个值以供输出

PHP 的 PDO 可以限制为单个查询吗?

为啥 PDO 不允许具有相同名称的多个占位符?