-4

自分でこれを理解したいので、これを投稿するのをためらっていますが、そうは思わない. 私は mysqli 用のクラスを設定して、可能な限り動的にしようとしています。はい、私は OOP には慣れていませんが、PHP と Mysql を趣味として使用しており、最近はかなり頻繁に使用しています。 . 切り替える時が来たと思いましたが、mysqli を使用した oop クラスと、複数の結果が得られる可能性のある準備されたステートメントはそれほど多くありません (はい、ドキュメントを確認しましたが、それを取得していないだけだと思います)。かなりの数時間後、これが私が持っているものです。私は必ずしも「迅速な修正」を求めているわけではありません。これはどうしても理解して学びたいので、しっかり説明してください。

root/config/dbconfig.php にデータベース情報を保存するために dbconfig.php ファイルを使用しています。

root/classes/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 に答える