1

そのため、使用に応じて変化する値の配列をメソッドに渡し、その配列をデータベースに挿入しています。私の問題は、パラメーターがバインドされる方法です。

public function insertValues($table, $cols, $values) 
{
    $mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DBDATABASE);

    $colString = implode(', ', $cols); // x, x, x
    $valString = implode(', ', array_fill(0, count($values), '?')); // ?, ?, ?

    $sql = "INSERT INTO $table ($colString) VALUES($valString)";
    if (!$stmt = $mysqli->prepare($sql))
         echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;

    // THIS IS THE PROBLEM AREA
    foreach ($values as $v)
        if (!$stmt->bind_param('s', $v))
            echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;

    if (!$stmt->execute())
        echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;

    $stmt->close();
    $mysqli->close();
}

一度に 1 つずつではなく、すべてのパラメーターを一度にバインドする方法が必要ですが、これを行う便利な方法がわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

3

あなたが探している問題の答えが PHP.net ( http://php.net/manual/en/mysqli-stmt.bind-param.php ) で見つかりました。便宜上ここに貼り付けます。すべての功績は、Nick9v ^ät^ hotmail -remove- -dot- com というメールを使用している男性に帰属します。

ステートメントの準備中に動的な数のフィールド値を扱う場合、このクラスが便利だと思います。

[編集者注: BindParam::add() を変更して、参照によって $value を受け入れるようにしました。これにより、新しいバージョンの PHP で警告が表示されなくなりました。]

<?php 
class BindParam{ 
    private $values = array(), $types = ''; 

    public function add( $type, &$value ){ 
        $this->values[] = $value; 
        $this->types .= $type; 
    } 

    public function get(){ 
        return array_merge(array($this->types), $this->values); 
    } 
} 
?> 

使い方はとても簡単です。インスタンスを作成し、add メソッドを使用して入力します。実行する準備が整ったら、get メソッドを使用します。

<?php 
$bindParam = new BindParam(); 
$qArray = array(); 

$use_part_1 = 1; 
$use_part_2 = 1; 
$use_part_3 = 1; 

$query = 'SELECT * FROM users WHERE '; 
if($use_part_1){ 
    $qArray[] = 'hair_color = ?'; 
    $bindParam->add('s', 'red'); 
} 
if($use_part_2){ 
    $qArray[] = 'age = ?'; 
    $bindParam->add('i', 25); 
} 
if($use_part_3){ 
    $qArray[] = 'balance = ?'; 
    $bindParam->add('d', 50.00); 
} 

$query .= implode(' OR ', $qArray); 

//call_user_func_array( array($stm, 'bind_param'), $bindParam->get()); 

echo $query . '<br/>'; 
var_dump($bindParam->get()); 
?> 

これにより、次のような結果が得られます。

SELECT * FROM users WHERE hair_color = ? または年齢 = ? または残高 = ? array(4) { [0]=> string(3) "sid" 1 => string(3) "red" [2]=> int(25) [3]=> float(50) }

于 2013-03-18T23:47:29.783 に答える
0

bind_param は、パラメーターごとに複数回呼び出すのではなく、関数への 1 回の呼び出しですべてのクエリ パラメーターを使用する必要があるため、コードは機能しません。また、参照によって渡される変数が必要なため、foreach 呼び出しでは常に同じになります。ループの最後の繰り返しで持っていた値を持つ変数。

最も簡単な方法は、型とパラメーターを使用して配列を構成し、call_user_func_array を呼び出して bind_param に渡すことです。次に例を示します。

$params = array();
$types = '';

foreach ($values as $k => $v)
{
    $types .= 's';
    $params[] = &$values[$k];
}

$bind_params = array_merge(array($types), $params);

if (!call_user_func_array(array($stmt, 'bind_param'), $bind_params))
    // ...

bind_param は、変数が値ではなく参照によって渡されることを想定していることに注意してください。それ以外の場合は、foreach ループではなく、値を使用して配列を構築する数行になります。

于 2013-03-19T01:06:31.670 に答える