2013-05-03 40 views
0

概述:我有一个应该拉基于它的ID号的数据库的排使用类方法来拉数据库信息

问题的函数:看来我的函数返回,但它没有返回任何东西。

详情:

-I这里使用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(); 
    } 

} 

>

当我运行该页面我收到的输出是这样的:?

做出来here1made出来here2在class1made使得它 here3做出来here4

我已经试过几件事情要解决这个问题,但我有麻烦搞清楚什么是错的。

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

+0

你确定在ID为“1”的字符表中有一行吗? – 2013-05-03 19:52:44

+0

我很惊讶你不会因'包含'database_connect.php';'在类声明中出错。 – Jon 2013-05-03 19:55:43

+0

yes表中有一行ID为1 – 2013-05-03 19:58:44

回答

2

你有一些问题在这里。

看起来你的DB类很不完整。对我来说,如果我创建一个类来表示数据库连接和各种操作,我将在该类中创建该连接,而不是通过某些包含(我假定连接正在发生)。这里是包含只会有条件地发生,如果你的代码击中那条线。在这种情况下,因为你在类中包含了任何实际的函数(比如构造函数),所以它永远不会被调用。

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

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 
} 

你现在有代表$this->mysqli一个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; 
    } 
} 

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

+0

你能解释stdClass()的实例化和它的返回吗? – 2013-05-03 23:30:27

+0

是的,当以这种方式使用预处理语句时,需要将结果集中的列绑定到变量。然后'fetch()'将这些列的值加载到变量中。所以我只是用行数据填充一个空的stdClass对象并返回它。 – 2013-05-03 23:32:28

+0

我永远不会想到它。谢谢:)我会尝试返回一些数组变量 – 2013-05-03 23:37:12

0

只是一个猜测,但我会提出这样的类名以上:

<?php 
include "database_connect.php"; 
    class db_class{ 
+0

同样的结果很不幸:/ – 2013-05-03 19:57:58

+0

在sql中做了一个“show tables”或者其他的东西来确保你连接到正确的数据库。或者只是从表格中选择*。看看你得到了什么。 – 2013-05-03 20:01:22