首页 > 解决方案 > 两个函数使用相同的代码,只有一个导致“未选择数据库”错误

问题描述

我几乎是 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>";
    }
}

标签: phpmysqli

解决方案


您的 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>"; 
        }
    }

    ?>

推荐阅读