php - 两个函数使用相同的代码,只有一个导致“未选择数据库”错误
问题描述
我几乎是 php 和 mysql 的初学者。有人可以解释为什么会出现这个错误以及如何解决它吗?我已将我的数据库连接代码放入它自己的函数中,并计划在我的其他函数中使用它。但是,当我这样做时,我的其他函数之一会返回“UNCAUGHT MYSQLI_SQL_EXCEPTION: NO DATABASE SELECTED”错误。我不确定出了什么问题。
我的代码:
db_connect.php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$host = 'localhost';
$user = 'user';
$password = 'password';
$forumDb = 'forumDb';
功能:
function connectForum() {
require_once '../php/db_connect.php';
static $forum;
$connectForum = mysqli_connect($host, $user, $password, $forumDb);
//check connection to database and set $forum to $connectForum if dB connection successful
if (!$connectForum) {
die('Connect Error: ' . mysqli_connect_error());
}
$forum = $connectForum;
return $forum;
}
//display main categories from database; this works fine
function dispMain() {
//connect to forumDb and select everything from mainCateg table
$forum = connectForum();
$query = "SELECT * ";
$query .= "FROM mainCateg";
//form query and test if successful; die if not
$result = mysqli_query($forum, $query) or die(mysqli_error($forum));
while ($row = mysqli_fetch_assoc($result)) {
echo "<section class='section-group'>";
echo "<h1>{$row['mainTitle']}</h1><p>{$row['mainDesc']}";
dispSub($row['mainId']);
echo "</section>";
}
}
//this function throws an error
function dispSub($mid) {
$forum = connectForum();
$query = "SELECT mainId, mainTitle, subId, subTitle, subDesc ";
$query .= "FROM mainCateg, subCateg ";
$query .= "WHERE ($mid = ?) AND ($mid = ?)";
//prepare statment and bind parmeters
$stmt = mysqli_prepare($forum, $query);
mysqli_stmt_bind_param($stmt, 'ii', $main_mid, $sub_mid);
//set variable values
$main_mid = "mainCateg.mainId";
$sub_mid = "subCateg.subMainId";
//execute prepared statement, bind result, and echo info using fetch
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $mainId, $mainTitle, $subId, $subTitle, $subDesc);
while ($row = mysqli_stmt_fetch($stmt)) {
echo "<p>Test echo</p>";
}
}
解决方案
您的 dispSub 函数正在循环运行,然后一次又一次地调用 connectForum() 函数,这并不好。我试图通过使用 global.js 来稍微优化你的代码。
PHP 中的一些预定义变量是“超全局变量”,这意味着无论范围如何,它们始终是可访问的——您可以从任何函数、类或文件访问它们,而无需做任何特别的事情。
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$host = '127.0.0.1';
$user = 'root';
$password = '';
$forumDb = 'aaaa';
$connectForum = mysqli_connect($host, $user, $password, $forumDb);
//check connection to database and set $forum to $connectForum if dB connection successful
if (!$connectForum)
{
die('Connect Error: ' . mysqli_connect_error());
}
//display main categories from database; this works fine
function dispMain()
{
global $connectForum;
//connect to forumDb and select everything from mainCateg table
$forum = connectForum();
$query = "SELECT * ";
$query .= "FROM mainCateg";
//form query and test if successful; die if not
$result = mysqli_query($forum, $query) or die(mysqli_error($forum));
while($row = mysqli_fetch_assoc($result))
{
echo "<section class='section-group'>";
echo "<h1>{$row['mainTitle']}</h1><p>{$row['mainDesc']}";
dispSub($row['mainId']);
echo "</section>";
}
}
//this function throws an error
function dispSub($mid)
{
global $connectForum;
$query = "SELECT mainId, mainTitle, subId, subTitle, subDesc ";
$query .= "FROM mainCateg, subCateg ";
$query .= "WHERE ($mid = ?) AND ($mid = ?)";
//prepare statment and bind parmeters
$stmt = mysqli_prepare($forum, $query);
mysqli_stmt_bind_param($stmt, 'ii', $main_mid, $sub_mid);
//set variable values
$main_mid = "mainCateg.mainId";
$sub_mid = "subCateg.subMainId";
//execute prepared statement, bind result, and echo info using fetch
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $mainId, $mainTitle, $subId, $subTitle, $subDesc);
while ($row = mysqli_stmt_fetch($stmt))
{
echo "<p>Test echo</p>";
}
}
?>
推荐阅读
- python - 如何搜索具有不同搜索数据的行(一些给定,一些没有)
- r - 无效类“GRanges”对象:1:“x@seqnames”与“x”不平行
- c++ - 我可以退回副本作为参考吗?
- maven - SpringBoot 依赖
- javascript - 使用js动态设置href属性
- c# - 在场景之间访问 Firebase 用户/数据库?
- python - 我将如何在此代码中添加选项和附加功能
- javascript - How can I calculate the angle between two lines with the same starting point?
- c# - 如何从 bson 文档中的键获取值以放入 ListBox (C#)
- .net - 如何在不加载该程序集的情况下将 AssemblyName 解析为程序集文件路径?