2017-11-18 10 views
1

未知数のパラメータを準備済みのPHP/MySQL文にバインドしようとしています。私は以下のコードを試しました。しかし、これはパラメータの数が設定されたクエリでのみ機能し、効率的な方法が必要であることがわかります。PHPでループする効率的なループパラメータ

switch($numparams){ 
        case 0: 
         @$stmt->bind_param(""); 
         break; 
        case 1: 
         @$stmt->bind_param($paramtypes, $param_arr0); 
         break; 
        case 2: 
         @$stmt->bind_param($paramtypes, $param_arr0,$param_arr1); 
         break; 
        case 3: 
         @$stmt->bind_param($paramtypes, $param_arr0,$param_arr1,$param_arr2); 
         break; 
        case 4: 
         @$stmt->bind_param($paramtypes, $param_arr0,$param_arr1,$param_arr2,$param_arr3); 
         break; 
        case 5: 
         @$stmt->bind_param($paramtypes, $param_arr0,$param_arr1,$param_arr2,$param_arr3,$param_arr4); 
         break; 
        case 6: 
         @$stmt->bind_param($paramtypes, $param_arr0,$param_arr1,$param_arr2,$param_arr3,$param_arr4,$param_arr5); 
         break; 
        case 7: 
         @$stmt->bind_param($paramtypes, $param_arr0,$param_arr1,$param_arr2,$param_arr3,$param_arr4,$param_arr5,$param_arr6); 
         break; 
        case 8: 
         @$stmt->bind_param($paramtypes, $param_arr0,$param_arr1,$param_arr2,$param_arr3,$param_arr4,$param_arr5,$param_arr6,$param_arr7); 
         break; 
        case 9: 
         @$stmt->bind_param($paramtypes, $param_arr0,$param_arr1,$param_arr2,$param_arr3,$param_arr4,$param_arr5,$param_arr6,$param_arr7,$param_arr8); 
         break; 
        case 10: 
         @$stmt->bind_param($paramtypes, $param_arr0,$param_arr1,$param_arr2,$param_arr3,$param_arr4,$param_arr5,$param_arr6,$param_arr7,$param_arr8,$param9); 
         break; 
} 

ご覧のとおり、コードは完全に非効率的でスケーラビリティはありません。 パラメータの数に基づいてforループ内の変数の名前を動的に指定しようとしましたが、スイッチケースのループ内で別々のbind_paramステートメントを持たずにbind_paramステートメントに挿入する方法を理解できませんでした)。これを行う方法はないかもしれないが、私はそこにあるべきだと思う。どちらの場合でも、私はどんな助けにも感謝します。

+0

私はあなたがもう一度あなたのデザインを見てする必要があると思います。 –

+0

あなたの問題は完全に 'mysqli' APIの煩わしさにあります。 //典型的な回避策は 'call_user_func_array'または楕円演算子です(PHP> = 5.6) – mario

答えて

1

あなたの解決策はcall_user_func_array()配列にあると思います。

まず、パラメータのタイプである「ssi ....」と似た文字列が必要です。

コード

$types = ''; 
    foreach($param_arr as $param) { 
     $types.= substr(strtolower(gettype($param)), 0, 1); 
    } 
call_user_func_array(array($stmt, 'bind_param'), array_merge(array($types), $param_arr))); 

リファレンス

http://www.pontikis.net/blog/dynamically-bind_param-array-mysqli http://php.net/manual/en/function.call-user-func-array.php

希望これはあなたを通じことができます;)

関連する問題