2016-11-04 15 views
-1

現在、私は10年前に書かれたウェブサイトをレビューしています。これらのウェブサイトは、PHP用の古いMySQL APIを使用しています。 PHPはバージョン5.3以降にアップグレードされていないため、古いAPIから各データベース要求をPDOに書き直す必要があります。PHP関数で引数のリファレンスを自動的に取得できますか?

元のコーダーは、INSERT、SELECTおよびUPDATE要求をラップするオブジェクトを各テーブルに作成しています。

多くの行があるテーブルでは、各オブジェクトのラップされた要求の各引数を引用するのは非常に辛いです。そこには数十のサイトが必要です。

だから、私は

後...ループ内でこれらを取得することにより、関数の各引数を引用に費やす時間を削減し、各関数内の2行のコードでそれらのそれぞれを引用する方法を考えますPHPのマニュアルを見て、それは関数の引数の参照を取得する方法がないようだ。私はそれらをコピーまたはカウントすることができますが、参照を取得することはできません。

この仕事に迷惑をかけるようなアイデアやヒントはありますか?ここで

は私がやるべきでないものの例である:

public function insert($titre, $tva, $intra, $remise = 0, 
    $tx_remise = 0, $frais = 0, $code = 0, $nom = '', 
    $design = '', $adr = '', $cp = '', $ville = '', 
    $tel = '', $fax = '', $rcs = '', $marq = '', 
    $marq_g = '') 
{ 
    $ville  = htmlspecialchars($ville); 
    $design  = htmlspecialchars($design); 
    $nom  = htmlspecialchars($nom); 
    $adr  = htmlspecialchars($adr); 
    $marq  = htmlspecialchars($marq); 
    $marq_g  = htmlspecialchars($marq_g); 

    $titre  = $this->db->quote($titre); 
    $tva  = $this->db->quote($tva); 
    $intra  = $this->db->quote($intra); 
    $remise  = $this->db->quote($remise); 
    $tx_remise = $this->db->quote($tx_remise); 
    $frais  = $this->db->quote($frais); 
    $code  = $this->db->quote($code); 
    $cp   = $this->db->quote($cp); 
    $tel  = $this->db->quote($tel); 
    $fax  = $this->db->quote($fax); 
    $rcs  = $this->db->quote($rcs); 

そして私は約やりたい:

public function insert(...) 
    { 
     foreach($function->argumentsReference as $ref) 
      $ref = quote($ref) 

もちろん$関数が実際のオブジェクトではありませんそれは私のアイデアをコードで説明する単なる方法です。

ありがとうございました。これについて

+2

どのように? –

+0

func_get_args()は、コピーされた引数の配列を返します。引数がコードの後半で再利用されるため、実際に必要なものではありません。 –

答えて

2

get_defined_varsを使用すると、スコープ内のすべての変数の連想配列を取得できます。したがって、関数の先頭でこれを使用する限り、すべての関数引数の名前付きコピーが有効になります。これは、func_get_argsを使用する場合とは異なります。これは、コールで提供されていない場合は、デフォルトの引数を含まないことに注意してください。

あなたのような何か使用して、すべての引数(引用など)にいくつかのロジックを適用することができます: `func_get_args()に関する関数リファレンス`について

<?php 
function foo($a, $b, $c) { 
    foreach (get_defined_vars() as $key => $value) { 
    ${$key} = $value * 2; 
    } 

    echo implode(', ', [$a, $b, $c]); 
} 

foo(1, 2, 3); 
// 2, 4, 6 
+1

優れた解決策、今日、私は 'get_defined_vars'を学びました。 –

0

何(PHP 5.6以降が必要):

function insert(...$data){ 
    var_dump($data); // This returns an array of all passed arguments. 

    array_map($data, function($datum){ 
     return htmlspecialchars($datum); 
    } 

    // Boom, now all entries in the $data array are "htmlspecialcharsified". 

    list($titre, $tva, $intra, $remise, $tx_remise, $frais, $code, $nom, $design, $adr, $cp, $ville, $tel, $fax, $rcs, $marq, $marq_g) = $data; 

    // As long as all parameters are passed in the correct order, you now have the desired variables available. 

    // Do your magic here 
} 
+0

良い答えですが、引数の数は限られています... –

+0

あなたは好きなだけ多くの引数を渡すことができるので、これに限定されません。引数の名前を連想配列として保持したいので(順序が重要でないように)、実際には 'func_get_arguments()'を使うべきです。 – Koen

+0

私ははるかによく理解しています。それ以上のニーズがあることを念頭に置いておきます。ありがとう。 –

0

あなたはPDOを取った場合は、PDO::prepareを使用する必要があり、その問題を取り除くことを取得します。

+0

あなたはそう思っていますが、私は元のコードから同じリクエストロジックに従いたいと思っていました。 –

+0

はい、なぜセキュリティを追加しないとpdoを使いたいのですか? – MaximeK

+0

MySQLに渡す前に、各変数を引用しています。 PDO :: prepare()は単なる引用だけではありませんか? –

関連する問題