尝试使用准备好的语句会起作用还是我有完全错误的想法


Trying to use prepared statements would this work or do I have the complete wrong idea?

所以首先,我从数据库生成该页面的菜单。

首先,我真的需要准备所有查询吗? 它似乎比简单的查询>获取>要复杂得多。

可能猜到我的做法是错误的。但我发现尝试然后找出我做错了什么更容易,因为我觉得这样学习更容易。

那么哪些部分是毫无意义或不正确的呢?

function menu() {
global $db;
$pagename = $_SERVER['PHP_SELF'];
// alternate ussage notes bind_param('sdi', $string, $decimal, $integer);
$stmt = $db->prepare("SELECT `p_id` FROM `pages` WHERE `name` = ?");
$stmt->bind_param('s', $pagename);
$stmt->execute();
$stmt->bind_result($page_id);
if ($stmt->num_rows()) { $isindb = true; }
else { $isindb = false; }
$stmt->fetch();
//echo $page_id; //uncomment to debug
$stmt->close(); // not sure if its closed too early. 
if ($isindb) {
// great. generate the menu.
$stmt = $db->prepare("SELECT * FROM `menu_items` WHERE `d_id` = ?");
$stmt->bind_param('i', $page_id);
$stmt->execute();
$stmt->store();
$stmt->bind_result($menulink_id, $menulink_d_id, $menulink_icon, $menulink_href, $menulink_title, $menulink_new_tab);
echo '<li><a href="index.php" id="top-link" class="skel-panels-ignoreHref"><span class="fa fa-home">Dasne Home</span></a></li>';
while ($r=$stmt->fetch()) {
if ($menulink_new_tab) { echo '<li><a href="'.$menulink_href.'" target="_blank"><span class="fa fa-'.$menulink_icon.'">'.$menulink_title.'</span></a></li>'; }
else { echo '<li><a href="'.$menulink_href.'"><span class="fa fa-'.$menulink_icon.'">'.$menulink_title.'</span></a></li>'; }
}
$stmt->close();
// close if isindb
}
else {
// give default menu 
default_menu();
}
// close function
}

另外,在关闭语句后,您仍然可以使用准备好的查询中的数据吗?

我真的需要准备所有查询吗?

是的。

似乎要复杂得多

是的。因为 mysqli 不打算按原样使用,只是一个低级 API,而你必须使用更高级别的抽象库。

那么哪些部分是毫无意义或不正确的呢?

这显然是一个题外话。

发现更容易尝试然后找出我做错了什么

确实如此,但你做错了。与其"尝试"大量代码,不如单独尝试一个查询。

因此,摆脱大部分代码,只留下一个查询运行,并使用 PDO 编写它。