【问题标题】:How to modify my PHP database extraction class to work with MySQLi如何修改我的 PHP 数据库提取类以使用 MySQLi
【发布时间】:2018-09-25 14:43:19
【问题描述】:

我收到一条警告:

mysqli_num_rows() 期望参数 1 为 mysqli_result

自从我使用 PHP 以来已经有一段时间了,这让我很难弄清楚为什么 MySQLReturn 类中的 size 函数让我感到悲伤。这是我多年前使用的一个旧课程,并尽我所能对其进行了修改,以使用php7MySQLi

    <?php

class MySQL {

private $host;
private $dbUser;
private $dbPass;
private $dbName;
private $dbConn;
private $connectError;

public function __construct($host,$dbUser,$dbPass,$dbName) {
    $this->host=$host;
    $this->dbUser=$dbUser;
    $this->dbPass=$dbPass;
    $this->dbName=$dbName;
    $this->connectToDb();
}

public function __destruct() {
}

public function connectToDb () {
    // Make connection to MySQL server
    if (!$this->dbConn = mysqli_connect($this->host,$this->dbUser,$this->dbPass)) {
        trigger_error('Could not connect to server');
        $this->connectError=true;
    // Select database
    } else if (!mysqli_select_db($this->dbConn,$this->dbName)) {
        trigger_error('Could not select database');
        $this->connectError=true;
    }
}

public function isError () {
    if ($this->connectError)
        return true;
    $error=mysqli_error($this->dbConn);
    if (empty($error))
        return false;
    else
        return true;
}


public function query($sql) {
 if (!$queryResource=mysqli_query($this->dbConn,$sql)) trigger_error ('Query failed: '.mysqli_error($this->dbConn).' SQL: '.$sql);
        $result = new MySQLReturn($this,$queryResource);
        return $result;
}
}

class MySQLReturn {

private $mysql;

private $query;

public function MySQLResult($mysql,$query) {
    $this->mysql=$mysql;
    $this->query=$query;
}

public function fetch() {
    if ($row=mysqli_fetch_array($this->query,MYSQL_ASSOC) ) {
        return $row;
    } else if ( $this->size() > 0 ) {
        mysqli_data_seek($this->query,0);
        return false;
    } else {
        return false;
    }
}

public function size() {
    return mysqli_num_rows($this->query);
}

public function insertID() {
    return mysqli_insert_id($this->mysql->dbConn);
}

public function isError() {
    return $this->mysql->isError();
}
}
?>

这就是我访问类函数的方式;

    <?php
$db = new MySQL($dbhost,$dbuser,$dbpass,$dbmain);
$authsql = $db->query("SELECT * FROM users WHERE email='".$uid."' AND password=MD5('".$pwd."')");

if ($authsql->size() >= '1') {
$logindtsql = $db->query("UPDATE users SET last_login=CURRENT_TIMESTAMP WHERE email='".$uid."' AND password=MD5('".$pwd."')");
$authsqlrow = $authsql->fetch();
extract($authsqlrow);
}

if ($authsql->size() == 0) {
   unset($_SESSION['uid']);
   unset($_SESSION['pwd']);
   session_destroy();
}
?>

我没有得到查询的大小

【问题讨论】:

  • 您是否进行过任何调试,例如转储$this-&gt;query 传递给mysqli_num_rows() 时的实际情况?
  • 也启用错误报告。
  • 错误报告已启用,并且该警告是我收到的唯一消息。我只收到一个警告,但是我没有从我正在寻找的查询中得到行数。
  • 实际的堆栈跟踪是什么?警告是$authsqlrow = $authsql-&gt;fetch(); 还是if ($authsql-&gt;size() == 0) 抛出的?如果你做过任何基本的调试,仍然很好奇。
  • 由“if ($authsql->size() == 0)”抛出。正如我的 OP 中提到的,自从我使用 PHP 以来已经有一段时间了。如何转储 $this->query?

标签: php oop mysqli


【解决方案1】:

改变了

public function MySQLResult($mysql,$query) {
    $this->mysql=$mysql;
    $this->query=$query;
}

public function __construct($mysql,$query) {
    $this->mysql=$mysql;
    $this->query=$query;
}

像魅力一样工作

【讨论】:

    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    相关资源
    最近更新 更多