使用可重用数据库连接器时遇到问题

时间:2015-07-14 16:42:45

标签: php mysql mysqli

我是php的新手。我一直无法通过PHP连接和使用数据。我真的没有太多关于这个问题的信息,也许我正在使用一些过时的方法,或者我做错了什么。我已经仔细检查并查看了这个网站上的信息,但我找不到多少。这是下面的代码。

错误如下:

  

致命错误:在第6行的C:\ xampp \ htdocs \ website \ Practice \ mysqli \ pdo.php中调用boolean上的成员函数query()

这意味着

附近存在问题
$result = $conn->query($sql)or die(mysqli_error());

我正确输入了用户名和密码。我甚至创建了一个新的用户名和密码,以确保。我没有其他想法为什么$ conn不起作用,我会喜欢这个问题的任何想法或想法!

connection.ini.php       

function dbConnect($usertype, $connectiontype = 'pdo') {
    $host = 'localhost';
    $db = 'student';
    if ($usertype == 'read') {
        $user = 'user';
        $pwd = 'pass';
    }

    elseif ($usertype == 'write') {
        $user = 'root';
        $pwd = 'password';
    }
    else {
        exit('Unrecognized connection type');
    }
    //Connection Code
    if ($connectionType ='mysqli') {
        return new mysqli($host, $user, $pwd, $db) or die ('Cannot open database');
        } 
else {

        try {
            return new PDO('mysql:host=$host;dbname=$db, $user, $pwd');
        }
        catch(PDOExecption $e) {
            echo 'Cannot connect to database';
            exit;
        }
    }
}
?>

mysqli.php

?php
require_once('connection.inc.php');
$conn = dbConnect('read', 'pdo');
$sql = 'SELECT * FROM guestbook';

$result = $conn->query($sql)or die(mysqli_error());
$numRows = $result->num_rows;
?>
<!DOCTYPE html>
<html>
<p> A total of <?php
echo $numRows;
?>
records were found.</p>
</html>

1 个答案:

答案 0 :(得分:0)

任何时候你得到......

  

“致命错误:在布尔”

上调用成员函数bind_param()

...可能是因为您的查询存在问题。 prepare()可能会返回FALSE(布尔值),但这个通用的失败消息并没有给您留下太多线索。你怎么知道你的查询有什么问题?你

首先,确保错误报告已打开且可见:在打开<?php标记后立即将这两行添加到文件顶部:

error_reporting(E_ALL);
ini_set('display_errors', 1);

如果您在php.ini中设置了错误报告,则无需担心这一点。只需确保您优雅地处理错误,并且永远不会向用户透露任何问题的真正原因。向公众展示真正的事业可以为那些想要伤害您的网站和服务器的人提供金色邀请函。如果您不想将错误发送到浏览器,则可以始终监视Web服务器错误日志。日志位置因服务器而异,例如,在Ubuntu上,错误日志通常位于/var/log/apache2/error.log。如果您正在检查Linux环境中的错误日志,您可以在控制台窗口中使用tail -f /path/to/log来查看实时发生的错误....或者在您创建错误时。

一旦您对标准错误报告进行了平衡,就会对数据库连接添加错误检查,并且查询将为您提供有关正在进行的问题的更多详细信息。看一下列名不正确的示例。首先,返回通用致命错误消息的代码:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

错误是通用的,对解决正在发生的事情没有多大帮助。

通过几行代码,您可以获得非常详细的信息,您可以使用这些信息立即解决问题 。检查prepare()语句的真实性,如果它是好的,您可以继续绑定和执行。

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error;
    echo $error; // 1054 Unknown column 'foo' in 'field list'
}

如果出现问题,您可以吐出一条错误消息,直接告诉您该问题。在这种情况下,表中没有foo列,解决问题是微不足道的。

如果您选择,您可以在函数或类中包含此检查,并通过如前所述优雅地处理错误来扩展它。