一起运行完全不相关的查询的最佳方法是?

时间:2016-03-06 09:18:36

标签: php mysql mysqli

我似乎经常遇到这个问题,通常是为了检查我的数据库中是否实际存在$ _GET [' id'],然后再运行另一个查询,与收到的ID有关或不相关

如果存在具有相同ID的记录,则显示HTML,例如:

if ($r) { #query was successful
    $num = mysqli_num_rows($r);
    if ($num == 1) {
        ?>

        <form method="post">
        ...
        <input type="submit" value="Submit" />
        </form>

        <?php
    } else {
        echo 'No records';
    }
} else {
    echo 'Query Failed';
}
mysqli_free_result($r);

以上是有效的,但我们要说我想在我的开始/结束表格标签之间执行另一个无关的查询;简单地做这样的事情是否恰当,我认为这是一个嵌套查询:

$q = "SELECT id FROM stuff WHERE id = $id";
$r = @mysqli_query($dbc, $q);
if ($r) { #query was successful
    $num = mysqli_num_rows($r);
    if ($num == 1) {
        ?>

        <form method="post">

        <?php
        $q = "SELECT example FROM somewhere";
        $r = @mysqli_query($dbc, $q);
        if ($r) {
            $num = mysqli_num_rows($r);
            if ($num > 0) {
                while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) {
                    echo $row['example'];
                }
            }
        } else {
            echo 'Query failed';
        }
        ?>

        <input type="submit" value="Submit" />
        </form>

        <?php
    } else {
        echo 'No records';
    }
} else {
    echo 'Query Failed';
}
mysqli_free_result($r);

或者也许创建一个布尔值,如下所示:

$id_status = 0;

$q = "SELECT id FROM stuff WHERE id = $id";
$r = @mysqli_query($dbc, $q);
if ($r) { #query was successful
    $num = mysqli_num_rows($r);
    if ($num == 1) {
        $id_status = 1;
    }
}
mysqli_free_result($r);

if ($id_status) { #Run another query
    ...
}

当涉及到为一个任务需要两个单独的查询结果时,我当前遇到了问题:(1)从另一个表生成输入,(2)显示当前值,(3)检查以查看已生成的输入匹配当前值,例如:

$q = "SELECT id, food FROM restaurants";
$q = "SELECT favFood FROM people WHERE id = 1"; #favFood is equal to the id of food
...
while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) {
    ?>
    #generate all food from table, make favFood the current selected input
    <input type="radio" name="yum" value="<?php echo $row['id']; ?>" />
    <?php
}

正如您所看到的,我遇到无关查询时遇到麻烦;最后一个例子可能适用于UNION或其他东西,但是我有一堆显示favFood的重复行,所以它感觉不对,例如:

favFood | id | food
    1   |  1 | Pizza
    1   |  2 | Burgers
    1   |  3 | Monkey Brains

在我结束之前,我只是想说我尝试使用mysqli_multi_query,但我很可能做错了;我甚至不确定它是否会在这种情况下起作用,或者它究竟能起作用。

谢谢!

2 个答案:

答案 0 :(得分:0)

如果你想在代码中多次检查记录是否存在,我建议创建一个返回bool的函数。

function record_exists($dbc, $q){
    $state = false;
    if($r = @mysqli_query($dbc, $q)){
        if(mysqli_num_rows($r) == 1){
            $state = true;
        }
        mysqli_free_result($r);
    }
    return $state;
}

$q = "SELECT id FROM stuff WHERE id = $id";
if(record_exists($dbc, $q)){
    echo 'Yay, it exists';
}

然后,如果你想SELECT表中的某些字段,但过滤器依赖于另一个表中的值,你可以JOIN查询中的两个表,如下所示:

SELECT restaurants.id, restaurants.food
FROM restaurants
JOIN people ON restaurants.id = people.favFood
WHERE people.id = 1

现在,您只需要{table}来自餐馆餐馆的SELECT字段,并将其过滤到桌上人员的个人ID中。

答案 1 :(得分:0)

你遇到这样一个问题的两个原因

  1. 你正在做很多无用的事情。
    • 没有人需要你“查询失败”的陈述。
    • num rows check也是多余的
    • 您编写的大多数代码只是重复
  2. 与上个世纪的PHP用户一样,您将数据库调用与HTML输出混合在一起。现在你看到“意大利面条代码”这个词被创造出来是有原因的。
  3. 您的数据库相关代码使用简单的mysqli包装器重写:

    $rows = [];
    $found = $db->getOne("SELECT id FROM stuff WHERE id = ?i", $id);
    if ($found) {
        $rows = $db->getAll("SELECT example FROM somewhere");
    }
    

    现在,您可以通过包含模板

    来内联或(更好)继续HTML输出
    ?>
    <?php if ($rows): ?>
        <form method="post">
        <?php foreach ($rows as $row): ?>
            <?=$row['example']?>
        <?php endforeach ?>
        <input type="submit" value="Submit" />
        </form>
    <?php else: ?>
        No records
    <?php endif ?>