使用php过滤mysql查询

aoyhnmkz  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(323)

我需要从mysql检索多个结果,并且必须多次使用同一个查询并添加 "and""where" 条款。例如:
我的第一个问题:

$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'";

…等等。学校的其他班级也一样。我目前正在一次又一次地编写查询,但我想知道是否有更简单的方法来实现这一点:从数组中的数据库中检索结果,然后对其进行过滤以供后续查询。

bbuxkriu

bbuxkriu1#

例如,可以使用variable存储类似的查询 $and ="AND SECTION= 'A'"; 并在主查询中使用变量来满足您的特定需求。
就像 $class = "SELECT * FROM schools WHERE class= '8'";$class = "SELECT * FROM schools WHERE class= '8' $and"; 可以使用条件将查询设置为任何变量。我认为这是有道理的。

wlsrxk51

wlsrxk512#

将所有类放在一个数组中,例如。 $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 
  }
}
dtcbnfnu

dtcbnfnu3#

$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>";

相关问题