【问题标题】:prepared statement method.. confused准备好的语句方法..困惑
【发布时间】:2013-09-01 07:55:24
【问题描述】:

我不知道缺少什么或为什么不显示数据。如果我不使用准备好的语句,我的代码就可以工作。当我使用准备好的语句时,代码似乎不再工作了。

db.php

Class Database{


public $mysqli;
public function __construct($db_host, $db_user, $db_password, $db_name){

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

}

    public function selectUserInfo($id){

        $stmt = $this->con->prepare("SELECT * FROM users WHERE os_id = ?");
        $stmt->bind_param("s", $id);
        if($stmt->execute() == FALSE){
            trigger_error($stmt->error, E_USER_ERROR);
        }else{
            $data = array();
            while($row = $stmt->fetch()){
                $data[] = $row;
            }
            return $data;
        }

}
}

config.php

define("DBHOST","somehost");
define("DBUSER","someroot");
define("DBPASS","somepassword");
define("DB","my_database");

这就是我在页面上显示它的方式。

require 'global/db.php';
require_once 'config.php';
$db = new Database(DBHOST, DBUSER, DBPASS, DB);
$data = $db->selectUserInfo($_GET['name']);
foreach ($data as $key) {
    # code...
    echo $key['os_fname'];
}

【问题讨论】:

  • 没有错误信息?您是否传递了一个名为 name 的 GET 参数?如果是这样,您的数据库中是否有 osd_id 等于该参数的行?
  • 它不显示错误消息。我想在我的 $_GET['name'] 中显示值 1
  • @Edgar 那么当你打开页面时,你的URL中有?name=1吗?
  • @vinodadhikary 不,不是。每个$key 是一行
  • @Phil 是的.. 我的网址中有 name=1

标签: php oop mysqli statements


【解决方案1】:

正如我们所定义的,问题出在您的foreach

问题在于你的阅读方式,fetch 没有关联属性,所以需要使用bind_result

这是fetch manual 也建议的黑客:

public function selectUserInfo($id)
{
    $stmt = $this->con->prepare("SELECT * FROM users WHERE os_id=?");
    $stmt->bind_param('i', $id);
    if(!$stmt->execute())
    {
        trigger_error($stmt->error, E_USER_ERROR);
    }
    else
    {
        $bindVarArray = array();
        $data = array();
        $result;
        $meta = $stmt->result_metadata();
        while ($column = $meta->fetch_field())
        {
            $columnName = str_replace(' ', '_', $column->name);
            $bindVarArray[] = &$result[$columnName];
        }
        call_user_func_array(array($stmt, 'bind_result'), $bindVarArray);

        $index = 0;
        while ($stmt->fetch() != null)
        {
            foreach ($result as $k => $v)
            {
                $data[$index][$k] = $v;
            }
            $index++;
        }
        return $data;
    }
}

然后你可以使用你的foreach 来阅读它:

foreach ($data as $result)
{
    echo $result['os_fname'], ' => ', $result['os_lname'], "\n";
}

您可以随时使用print_r 来查看生成的数组是怎样的:

print_r($data);

【讨论】:

  • @Edgar 然后查看你可能忘记关闭变量的error_log 文件。或者发布global/db.phpconfig.php的内容,去掉密码、用户名、ip等敏感数据。
  • 我在上面编辑了我的帖子。当我删除我的 foreach 并将其更改为 print_r 时,它显示了 Array ( [0] => Edgar )
  • @Edgar ;) 你去了,你的问题是你没有关联你的数组,因此它不会有 $key['os_fname'] 你必须使用 $stmt->bind_result($fname); 并在你的查询中声明所有字段您想像我在示例中那样阅读或通过索引调用变量。 foreach ($data as $value) echo $value;echo $data[0], .... rest of columns ..., $data[1], "\n";
  • 所以代码会是这样的吗?我对么 ? if ($stmt->execute()) { $data = array(); $result = $stmt->bind_result($fname, $lname, $email); while($stmt->fetch()) { $data[] = $result; } 返回$数据; }
  • @Edgar 查看更新它的 hack 以自动读取字段。
【解决方案2】:

您在 DB 中的 od_id 类型是字符串还是整数?如果是整数

public function selectUserInfo($id){

    $stmt = $this->con->prepare("SELECT * FROM users WHERE os_id = ?");
    $stmt->bind_param("i", $id);//use 'i' instead of 's'

    if($stmt->execute() == FALSE){
        trigger_error($stmt->error, E_USER_ERROR);
    }else{
        $data = array();
        while($row = $stmt->fetch()){
            $data[] = $row;
        }
        return $data;
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多