使用 php 过滤 mysql 查询



我需要从MySQL检索多个结果,并且必须多次使用相同的查询,并在"where"子句中添加"and"。 例如:

我的第一个查询:

$class = "SELECT * FROM schools WHERE class= '8'";

我的其他疑问:

$class8a ="SELECT * FROM schools WHERE class= '8' AND SECTION= 'A'";
$class8b ="SELECT * FROM schools WHERE class= '8' AND SECTION= 'B'";

。等。 学校的所有其他班级也是如此。 我目前正在一次又一次地编写查询,但我想知道是否有更简单的方法可以通过从数组中的数据库中检索结果,然后将其过滤以进行后续查询来做到这一点。

$class8a ="SELECT * FROM schools WHERE class= '8' AND SECTION= 'A'";

您将查询存储到文本变量中,这意味着您打算稍后使用它,在那里您将编写$class8a

$db->query($class8a);

这可能会给您留下另一个问题:您必须知道类 8 的 A 部分存在。如果添加或删除了一个类,你需要重写你的代码,这效率低下,而且容易出错。

因此,一种方法可能是获取学校中的所有类和所有部分并填充一个数组

$query = "SELECT DISTINCT class, section FROM schools";
$stmt  = $db->query($query);
$pairs = [ ]; // or $pairs = array(); in older PHPs
while ($pair = $stmt->fetch()) {
if (!array_key_exists($pair['class'], $pairs) {
$pairs[$pair['class']] = [];
}
$pairs[$pair['class']][$pair['section']] = "SELECT * FROM schools WHERE class= '{$pair['class']}' AND section = '{$pair['section']}'";
}

现在您可以使用$pairs['8']['A']而不是$class8a。或者,您可以使用变量变量定义变量:

while ($pair = $stmt->fetch()) {
$nameOfVar = $pair['class'] . strtolower($pair['section']);
$$nameOfVar = "SELECT * FROM schools WHERE class= '{$pair['class']}' AND section = '{$pair['section']}'";
}

但是对于命名变量,您仍然没有一种简单的方法来知道$class7f是否存在(您可以使用isset但我觉得这很尴尬),更不用说枚举它们或知道可能存在哪些类了,而对于数组,您可以(使用foreach)。

如果有人创建了一个辅助部分(你有那些吗?)并称它为A'而不是A*A+A1/2,"因为一颗星星,一个加号或额外的一半可能会被父母或学生视为评判"。虽然A'被代码视为SQL注入攻击:WHERE section='A'';是语法错误。

您现在必须在内存中保留许多类似的查询。

推荐的解决方案

更好的是,一旦你有了类和部分,只需动态构建查询:

$classQuery = $db->prepare('SELECT * FROM schools WHERE class=? AND section=?');

然后执行,使用 PDO 这很简单:

$classQuery->execute([ '8', "A'" ]);

您可以使用数组来跟踪事物并知道存在哪些类:

$query = "SELECT DISTINCT class, section FROM schools;";
$stmt  = $db->query($query);
$pairs = [ ]; // or $pairs = array(); in older PHPs
while ($pair = $stmt->fetch()) {
if (!array_key_exists($pair['class'], $pairs) {
$pairs[$pair['class']] = [];
}
$pairs[$pair['class']][] = $pair['section'];
}

例如,这允许您在HTML中放置一个类组合:

$combo = '<select name="class">';
foreach (array_keys($pairs) as $class) {
$combo .= "<option value="{$class}">{$class}</option>";
}
$combo .= "</select>";

将所有类放在一个数组中,例如$classArray = ['8','9'];和另一个数组中的部分,例如$sectionArray = ['A','B'];现在您运行查询以迭代classArray然后sectionArray

例如
foreach($classArray as $className)
{
foreach($sectionArray as $sectionName)
{
$qry = 'SELECT * FROM schools WHERE class="'.$className. '" AND section ="'.$sectionName.'"';
// Your Code 
}
}

例如,您可以使用变量来存储类似的查询

$and ="AND SECTION= 'A'";

并在主查询中使用该变量以满足您的特定要求。

喜欢$class = "SELECT * FROM schools WHERE class= '8'";

$class = "SELECT * FROM schools WHERE class= '8' $and";

您可以使用条件将查询设置为任何变量。 我认为这是有道理的。

最新更新