-4

我很犹豫要不要发布这个,因为我真的更愿意自己解决这个问题,但我想我不会。我只是想为 mysqli 的东西设置一个类,使其尽可能动态,是的,我是 OOP 的新手,但一直在使用 PHP 和 Mysql 作为爱好,而且最近一段时间以来更甚. 我想是时候切换了,但是在 oop 类上并没有太多的 mysqli 和准备好的语句,可能有多个结果(是的,我已经检查了文档,猜我只是没有得到它或其他东西)。几个小时后,这就是我所拥有的。我不一定要寻找“快速修复”。我真的很想了解并学习,所以请彻底解释。

我正在使用 dbconfig.php 文件将我的数据库信息存储在 root/config/dbconfig.php

在根/类/mysqlicon.php

<?php
/*
* class MYSQLIDB
* @param Host
* @param User 
* @param Password
* @param Name
*/
class MYSQLIDB
{
private $host;       //MySQL Host
private $user;       //MySQL User
private $pass;       //MySQL Password
private $name;       //MySQL Name   
private $mysqli;     //MySQLi Object
private $last_query; //Last Query Run

/*
 * Class Constructor
 * Creates a new MySQLi Object
*/
public function __construct()
{   
    include('./config/dbconfig.php');
    $this->host = $db_host;
    $this->user = $db_user;
    $this->pass = $db_pass;
    $this->name = $db_name;

    $this->mysqli = new mysqli($this->host, $this->user, $this->pass, $this->name);
    if ($mysqli->connect_errno) {
        return "Failed to connect to MySQLi: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }

}

private function __destruct()
{   
    $mysqli->close();
}

public function select($fields, $from, $where, $whereVal, $type, $orderByVal, $ASDESC, $limitVal)
{
    if (is_int($whereVal))
    {
        $bindVal = 'i';
    } else {
        $bindVal = 's';
    }
    switch($type)
    {
        case "regular":
            $queryPre = "SELECT " . $fields;
            $querySuff = " WHERE " . $where . " =  ?";
            break;
        case "orderByLimit":
            $queryPre = "SELECT " . $fields;
            $querySuff = " ORDER BY " . $orderByVal . " " . $ASDESC . " LIMIT " . $limitVal;
            break;
    }
    //$query = "SELECT * FROM news ORDER BY id DESC LIMIT 4";
    if ($stmt = $mysqli->prepare('$queryPre . " FROM " . $from . " " . $querySuff')) 
    {
        if ($type == 'regular') {
            $stmt->bind_param($bindVal, $whereVal);
        }
        $stmt->execute(); 
        $stmt->bind_result($values); 
        $stmt->store_result(); 
        $sr = new Statement_Result($stmt);      
        $stmt->fetch(); 
        // call by this style printf("ID: %d\n", $sr->Get('id') ); 
        //$stmt->fetch(); 
        //$stmt->close(); 
        //return $value;
        printf("ID: %d\n", $sr->Get_Array() );
    } else return null; 
}
//use to call $db = new MYSQLI('localhost', 'root', '', 'blog');
/*
 * Function Select
 * @param fields
 * @param from
 * @param where
 * @returns Query Result Set

function select($fields, $from, $where, $orderBy, $ASDESC, $limit, varNamesSent)
{   
    if ($orderBy == null &&)
    $query = "SELECT " . $fields . " FROM `" . $from . "` WHERE " . $where;
    $result = $this->mysqli->query($query) or exit("Error code ({$sql->errno}): {$sql->error}");

    $this->last_query = $query;

    return $result;
}

/*
 * Function Insert
 * @param into
 * @param values
 * @returns boolean
*/
public function insert($into, $values)
{
    $query = "INSERT INTO " . $into . " VALUES(" . $values . ")";

    $this->last_query = $query;

    if($this->mysqli->query($query))
    {
        return true;
    } else {
        return false;
    }

}

/*
 * Function Delete
 * @param from
 * @param where
 * @returns boolean
*/
public function delete($from, $where)
{
    $query = "DELETE FROM " . $from . " WHERE " . $where;

    $this->last_query = $query;

    if($this->mysqli->query($query))
    {
        return true;
    } else {
        return false;
    }
}
}
//Hand arrays for multiple returned items from database
class Statement_Result 
{ 
private $_bindVarsArray = array(); 
private $_results = array(); 

public function __construct(&$stmt) 
{ 
    $meta = $stmt->result_metadata(); 

    while ($columnName = $meta->fetch_field()) 
        $this->_bindVarsArray[] = &$this->_results[$columnName->name]; 

    call_user_func_array(array($stmt, 'bind_result'), $this->_bindVarsArray);

    $meta->close(); 
} 

public function Get_Array() 
{ 
    return $this->_results;    
} 

public function Get($column_name) 
{ 
    return $this->_results[$column_name]; 
} 
} 
?>

作为测试,我试图通过以下方式提取数据库中的所有新闻:

<?php
require_once('classes/mysqlicon.php');
$testing = new MYSQLIDB;
$testing->select('*','news',null,null,'orderByLimit','id','DESC',4);
?>

但我真正想要的是可以做到这一点的东西:

<?php
    /*
    require('config/dbconfig.php');
    $query = "SELECT * FROM news ORDER BY id DESC LIMIT 4";
    if ($stmt = $mysqli->prepare($query)) {
        // execute statement
        $stmt->execute();

        // bind result variables
        $stmt->bind_result($idn, $titlen, $categoryn, $descn, $postdaten, $authorn);

        // fetch values
        while ($stmt->fetch()) {*/

            //echo 'id: '. $id .' title: '. $title;
            echo "<table border='0'>";
            $shortDescLengthn = strlen($descn);
            if ($shortDescLengthn > 106) {
                $sDCutn = 106 - $shortDescLengthn;
                $shortDescn = substr($descn, 0, $sDCutn);
            } else {
                $shortDescn = $descn;
            }
            echo "<h1>$titlen</h1>"; 
            echo "<tr><td>$shortDescn...</td></tr>"; 
            echo '<tr><td><a href="javascript:void(0);" onclick="' 
            . 'readMore(' . $idn . ',' . htmlspecialchars(json_encode($titlen)) . ',' 
            . htmlspecialchars(json_encode($categoryn)) . ',' 
            . htmlspecialchars(json_encode($descn)) . ',' . htmlspecialchars(json_encode($postdaten)) . ',' 
            . htmlspecialchars(json_encode($authorn)) . ')">Read More</a></td></tr>'; 
            echo "<tr><td>Written by: $authorn</td></tr>"; 
            echo '<tr><td><img src="images/hardcore-games-newsbar-border.png" width="468px" /></td></tr>'; 
        }
        echo "</table><br />";

        /* close statement */
        $stmt->close();
    }

    /* close connection */
    $mysqli->close();
?>

再次,拜托,请详细解释。我有时是个笨蛋。

4

1 回答 1

3

我假设错误来自这一行:

if ($stmt = $mysqli->prepare('$queryPre . " FROM " . $from . " " . $querySuff'))

$mysqli未在此函数的上下文中定义。您应该$this->mysqli改为访问。这同样适用于您所做的其他参考,例如:

if ($mysqli->connect_errno)
于 2012-08-06T00:59:28.960 回答