0

概述:我有一个函数应该根据它的 id 号拉出一行数据库

问题:似乎我的函数正在返回,但它没有返回任何内容。

细节:

-我在这里使用了 2 个不同的文件:db_class.php 和 character_pull.php

- 另外我有一个包含 1 个表(字符)的数据库,其中包含列“id”

- 有用于调试的回声线。我会给出输出是什么。

character_pull.php:

<?php

    include "db_class.php";

    echo "made it out here1";

    $classobject = new db_class();
    echo "made it out here2";

    $results = $classobject->getPlayerStats("1");

    print_r($results);

    echo "made it out here3";

        $id = "id: " . $results['id'];
        $name = "name: " . $results['charname'];
        $strength = "strength: " . $results['strength'];
        $defense = "defense: " . $results['defense'];
        $health = "health: " . $results['health'];
        $level = "level: " . $results['level'];
        $type = "type: " . $results['type'];
        $experience = "experience: " . $results['experience'];

    echo"<br/>"; 

    echo "made it out here4";
?>

db_class.php:

<?php

include "database_connect.php";

class db_class{



    public function getPlayerStats($id){

        echo "<br/>" . "making it in class1";

        $query = "SELECT * FROM characters WHERE id = $id";
        $result = mysqli_query($query);

        return $char = mysqli_fetch_array($result);


            $result ->close();
    }

}

?>

我运行页面时收到的输出是这样的:

在这里成功1在这里成功2在课堂上成功1在这里成功3在这里成功4

我已经尝试了几件事来解决这个问题,但我无法找出问题所在。

我知道这可能是非常草率和原始的,但尽量不要笑得太厉害,也许你可以帮助我:P。提前致谢。

4

2 回答 2

2

你在这里有很多问题。

看来您的数据库类很不完整。对我来说,如果我正在创建一个类来表示数据库连接和各种操作,我将在该类中建立该连接,而不是通过一些包含(我假设连接正在发生)。这里是包含仅在您的代码命中该行时才会有条件地发生。在这种情况下,由于您将其包含在类中的任何实际函数之外(如构造函数),它将永远不会被调用。

我会建议这样的事情来解决这个问题:

class db_class {
    protected $mysqli;
    private $db_host = 'your_db_host';
    private $db_user = 'your_db_user';
    private $db_password = 'your_db_password';
    protected $db_name = 'default_db_name';

    public __construct($db_host = NULL, $db_user = NULL, $db_password = NULL, $db_name = NULL) {
        if (!empty($db_host)) {
            $this->db_host= $db_host;
        }
        // validate other parameters similarly

        $mysqli = new mysqli($this->db_host, $this->db_use, $this->db_password, $this->db_name);

        if($mysqli->connect_error) {
            throw new Exception('Connect Error: ' . $mysqli->connect_errno . ', ' . $mysqli->connect_error);
        } else {
            $this->mysqli = $mysqli;
        }
    }

    // other class methods
}

您现在有一个表示 mysqli 连接存储的对象$this->mysqli

您的getPlayerStats()方法现在可能看起来像

public function getPlayerStats($id) {
    if(empty($id)) {
        throw new Exception ('An empty value was passed for id');
    }
    // verify this is integer-like value
    $id = (string)$id;
    $pattern = '/^\d+$/';
    if (!preg_match($pattern, $id) !== 1) {
        throw new Exception ('A non-integer value was passed for id');
    }
    $id = (int)$id;

    $query = "SELECT id, name, strength, defense, level, health, type, experience FROM characters WHERE id = :id";
    $stmt = $this->mysqli->prepare($query);
    $stmt->bind_param('i', $id);
    $result = $stmt->execute();

    if (false === $result) {
        throw new Exception('Query error: ' . $stmt->error);
    } else {
        $obj = new stdClass();
        $stmt->bind_result($obj->id, $obj->name, $obj->strength, $obj->defense, $obj->level, $obj, health, $obj->type, $obj->experience);
        $stmt->fetch();
        $stmt->close();
        return $obj;
    }
}

注意我在这里使用了准备好的语句,你应该习惯使用它,因为它确实是查询数据库的最佳实践。另请注意,我在整个代码中都添加了错误情况的处理。你应该养成这样做的习惯,因为它会使调试更容易。

于 2013-05-03T20:35:21.640 回答
0

只是一个猜测,但我会将其移至类名之上:

<?php
include "database_connect.php";
    class db_class{
于 2013-05-03T19:57:00.030 回答