2017-09-04 4 views
-2

私は、クエリのフォロー配列を持っている:配列をループし、パラメータを渡して文字列を返す無名関数を作成するにはどうすればよいですか?

<?php 

$queries_0 = [ 
       /* 
        Custom Info 
       */     
       0=>"INSERT INTO tbl1(field1, field2,field3,created_at) VALUES ('$p[0]', '$p[2]', '$p[2]', 'CURRENT_TIMESTAMP');", 
       1=>"SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName 
        FROM ((Orders 
        INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID) 
        INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID) 
        WHERE 
        Shippers.ShipperName='$p[0]'", 


       /* 
        Payments 
       */ 
       2=>"SELECT * FROM Customers 
        WHERE City LIKE '$p[0]%';", 
       3=>"SELECT * FROM Customers 
        WHERE Country='$p[0]' AND City='$p[1]';", 

]; 

目標は、唯一のキーと必要なパラメータを渡す目的のクエリを取得することです。

このその目標を達成するためには、私がやったことです:

$queries = array( 
    0=>function(array $p) { 
    return "INSERT INTO tbl1(field1, field2,field3,created_at) VALUES ('$p[0]', '$p[2]', '$p[2]', 'CURRENT_TIMESTAMP');"; 
    }, 

    1=>function(array $p) { 
    return "SELECT Orders.OrderID, Customers.CustomerName, Shippers.ShipperName 
        FROM ((Orders 
        INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID) 
        INNER JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID) 
        WHERE 
        Shippers.ShipperName='$p[0]'"; 
    }, 

    2=>function(array $p) { 
    return "SELECT * FROM Customers 
        WHERE City LIKE '$p[0]%';"; 
    }, 

    3=>function(array $p) { 
    return "SELECT * FROM Customers 
        WHERE Country='$p[0]' AND City='$p[1]';"; 
    } 
); 

テスト:

$sql=$queries[0](['f1','f2','f3']); 
echo $sql; 
$sql=$queries[3](['US','NewYork']); 
echo $sql; 

結果:

INSERT INTO tbl1(field1, field2,field3,created_at) VALUES ('f1', 'f3', 'f3', 'CURRENT_TIMESTAMP');  
SELECT * FROM Customers WHERE Country='US' AND City='NewYork'; 

今、私はその配列クエリをクリーンアップしたいと思いますのようにする$ queries_0。ここでの目的は、関数の反復を避けることです。同じことをしているので、無関係な関数を作成し、パラメータ$ pを渡して文字列を返します。

これは無名関数せずに、これまでの私の試みであり、動作していない:

function get_sql(array $param) { 
    foreach ($param as $k => $p) { 
     return $queries_0[$k];//$queries_0[$k] is the string itsef. 
    } 
} 


$res=get_sql(["0"=>['f1','f2','f3']]); 
echo $res; //null 

無名関数の有無にかかわらずアプローチがどうあるべきか?

+0

'$ res_'が 'get_sql'関数スコープにないため、' $ res'は 'null'です。エラー報告を 'E_ALL'に設定してください – Phil

答えて

0

PDOとパラメータバインドを使用することをお勧めします。たとえば、位置 "?"を使用して、プレースホルダ...

$queries_0 = [ 
    'INSERT INTO tbl1(field1, field2,field3,created_at) VALUES (?, ?, ?, CURRENT_TIMESTAMP)', 
    // and so on 
]; 

$pdo->prepare($queries_0[0])->execute(['f1','f2','f3']); 
0

私はPDOパラメータバインディングの使用に同意します。
しかし、あなた自身のライブラリを使いたいなら。
私の解決策です。

function getSQL(array $params){ 
    $opts = array(
        '0'=>'SELECT * FROM tbl WHERE username=?' 
        ,'1'=>'INSERT INTO tbl VALUES(?,?,?,?)' 
        ,'2'=>'UPDATE tbl SET username=? WHERE id=?' 
        ,'3'=>'DELETE FROM tbl WHERE id=?' 
       ); //queries 

    foreach($params as $param => $sub){ 
     if(!is_array($sub) && !($sub===null))return null; // invalid -- value not array or null 
     $query = $opts[$param]; 
     if(substr_count($query,'?') != sizeof($sub))return null; // invalid -- not equal number of params 
     $last_position = strpos($query,'?'); 
     foreach($sub as $value){ 
      $query = substr_replace($query,$value,strpos($query,'?',$last_position),sizeof($query)); 
      $last_position += strlen($value)+1; 
     } 
    } 
    return $query; 
} 
echo getSQL(['0'=>['0']]).'<br/>';    // SELECT * FROM tbl WHERE username=0 
echo getSQL(['1'=>['0','gello?','gel?g?g?g','3']]).'<br/>'; // INSERT INTO tbl VALUES(0,gello?,gel?g?g?g,3) 
関連する問題