一个奇怪的临时问题


A weird while issue

下面的代码中有3个while。在此之前,我只有1个while,但在扩展CMS后,它不想再显示内容了,我不确定是什么导致了这个错误。

<?php
$stmt = $dbConnection->prepare('SELECT * FROM paginas WHERE public="1"');
$stmt->execute();
$result = $stmt->get_result();
$url = $dbConnection->prepare('SELECT * FROM websettings WHERE setting="url"');
$url->execute();
$urlresult = $url->get_result();
$startpagina = $dbConnection->prepare('SELECT * FROM websettings WHERE setting="startpagina"');
$startpagina->execute();
$startresult = $startpagina->get_result();
if(mysqli_num_rows($result) > 0) {
    while ($row = $result->fetch_assoc()) {
        while ($urlrow = $urlresult->fetch_assoc()) {
            while ($startrow = $startresult->fetch_assoc()) {
                if(!empty($_GET[$urlrow['value']])) {
                    if(isset($_GET[$urlrow['value']]) && $_GET[$urlrow['value']] == $row['name']) {
                        ?>
                            <h1><?php echo $row["heading"]; ?></h1>
                            <?php echo ubbreplace($row["content"]); ?>
                        <?php
                    }
                } else {
                    header("Location: ?" . $urlrow['value'] . "=" . $startrow["value"]);
                }
            }
        }
    }
} else {
    echo "Er zijn nog geen pagina's aangemaakt.";
}
?>

有人能帮帮我吗?我真的在试着修复它,没有什么能真正起作用。


解决方案

<?php
$stmt = $dbConnection->prepare('SELECT * FROM paginas WHERE public="1"');
$stmt->execute();
$result = $stmt->get_result();
if(mysqli_num_rows($result) > 0) {
    while ($row = $result->fetch_assoc()) {
        $url = $dbConnection->prepare('SELECT * FROM websettings WHERE setting="url"');
        $url->execute();
        $urlresult = $url->get_result();
        while ($urlrow = $urlresult->fetch_assoc()) {
            $startpagina = $dbConnection->prepare('SELECT * FROM websettings WHERE setting="startpagina"');
            $startpagina->execute();
            $startresult = $startpagina->get_result();
            while ($startrow = $startresult->fetch_assoc()) {
                if(!empty($_GET[$urlrow['value']])) {
                    if(isset($_GET[$urlrow['value']]) && $_GET[$urlrow['value']] == $row['name']) {
                        ?>
                            <h1><?php echo $row["heading"]; ?></h1>
                            <?php echo ubbreplace($row["content"]); ?>
                        <?php
                    }
                } else {
                    header("Location: ?" . $urlrow['value'] . "=" . $startrow["value"]);
                }
            }
        }
    }
} else {
    echo "Er zijn nog geen pagina's aangemaakt.";
}
?>

摆脱"dynamic"parametername-将其隐藏在可以以静态方式访问的参数后面:

?page=index

成为

`?p_mode=page&p_selection=index` 

或者其他什么。(你真的需要page是动态的吗?-我想不是。)

然后,您可以很容易地使用单个查询(假设前两个参数不是硬编码的,而是从GET参数p_modep_selection中使用的):

set @setting_name = "page"; 
set @setting_value = "index"; 
SELECT 
  p.*
FROM
  paginas p
right JOIN
  websettings ws 
ON 
  ws.`value` = p.`name`
WHERE 
  p.`public` = 1 AND
  ws.`setting` = @setting_name AND
  ws.`value` = @setting_value;

http://sqlfiddle.com/#!9/ce97a/2

但是,请注意,在这个小示例中,您的"设置名称"是无用的,因为它只连接值。

(参见此示例,导致错误的结果:http://sqlfiddle.com/#!9/d4abb0/1)

因此,如果您想要不同的密钥,请将它们添加到paginas表中,使它们(和值)成为唯一的一对:

public | heading | content | key      | value
1        Test      Test      mode       index
1        Test 2    Test 2    anotherKey index  

并在一次运行中查询它们。

添加结尾:请阅读此帖子:https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem

试着询问您的实际问题,而不是您认为未来可能有效的解决方案。