0

次のようなデータベースクラスがあります。

class Db
{
public $mysqli = null;

public function __construct($port = NULL)
{
    include $_SERVER['DOCUMENT_ROOT'].'/php/'.'config.php';
    if($port == NULL)
        $port = ini_get('mysqli.default_port');

    $this->mysqli = new mysqli(HOST, USER, PASS, DB, $port)
        or die('There was a problem connecting to the database');

    if ($this->mysqli->connect_errno) {
        echo "Error MySQLi: ( " . $this->mysqli->connect_errno  . ") " . $this->mysqli->connect_error;
        exit();
     }
       $this->mysqli->set_charset("utf8"); 
}

これらはすべて正常に機能します。次の関数を追加しました。

public function insert($sql, $bind) {
    $stmt = $this->mysqli->prepare($sql);
    $stmt->bind_param('sssssss', $bind[0], $bind[1], $bind[2], $bind[3], $bind[4], $bind[5], $bind[6]);
    $stmt->execute();
}

もちろん問題は、これがあまり動的ではないことです。バインドするものは 2 つしかない場合があり、必ずしも文字列であるとは限りません。

たとえば、私はこれを行います:

$db = new Db();
$strings = array ($chosenImage, $id);
$db->insert("INSERT INTO Media VALUES (NULL, ?, ?)", $strings);

したがって、これは 2 つのバインドのみです。

私の質問は 2 つあります。1) この関数を、配列の型とサイズをできるだけきれいな方法で評価する関数に変えるにはどうすればよいでしょうか?

2)さらに、同様の機能を使用して(リコールと呼びましょう)selectステートメントを使用して2つのアイテムを返し、それらをバインドして返す方法を教えてください(返したい金額がクエリによって変わると仮定します)

4

1 に答える 1

3

-1. 挿入に明確な機能を持つことは、まったく間違った考えです。SET ステートメントを動的に作成するには、実際には SET ステートメントのヘルパーのみが必要です。残りは、従来のquery()関数を使用して呼び出す必要があります。
0. 型はそれほど重要ではありませんs。すべてに使用してもまったく問題ありません。
1.call_user_func_array ()
2.get_result ()

于 2013-10-28T21:49:45.623 に答える