0

次のような SQL クエリ文字列があります。

SELECT * FROM `oc_product` WHERE `manufacturer_id` = ? AND `date_added` < ?  `product_id` IN (?) AND `price` > ? ORDER BY `product_id` ASC;

これは、次のように Query クラスのコンストラクターに渡されます。

$query = new Query("SELECT * FROM `oc_product` WHERE `manufacturer_id` = ? AND `date_added` < ?  `product_id` IN (?) AND `price` > ? ORDER BY `product_id` ASC;", 27, date("Y-m-d H:i:s"), [17,18,29,30,46,47], 27.75);

私は現在、疑問符を区切り文字として文字列を分解し、マークの数を数えてパラメーターをトラバースし、クエリ文字列を再構成する関数を持っているので、配列であるパラメーターごとに、その疑問符を次のように置き換えますパラメータとして多くの疑問符が配列内にあります (そのため、のようIN (?)に修正されるのではなくIN (?,?,?,?,?,?))。

しかし、私は自分の関数がどのように見えるかが好きではなく、より良い等価物、または可能であれば正規表現/関数/SPL駆動の手順を見つけて、現在行っているよりもはるかに簡単に置換できるようにしたいと考えています.

ヒントを教えていただけますか?

4

2 に答える 2

2

このようなことを試してください。

$params = array(27, date("Y-m-d H:i:s"), '[17,18,29,30,46,47]', 27.75);
$counter = 0;

$query = "SELECT * FROM `oc_product` WHERE `manufacturer_id` = ? AND `date_added` < ?  `product_id` IN (?) AND `price` > ? ORDER BY `product_id` ASC;";

echo preg_replace_callback('/\?/', function($matches) {
    $GLOBALS['counter']++;

    return $GLOBALS['params'][$GLOBALS['counter']-1];
}, $query);

出力

SELECT * FROM `oc_product` WHERE `manufacturer_id` = 27 AND `date_added` < 2013-04-08 10:29:43 `product_id` IN ([17,18,29,30,46,47]) AND `price` > 27.75 ORDER BY `product_id` ASC;

部分についてはわかりませんIN ([17,18,29,30,46,47])が、配列内の文字列を好みに合わせて変更できます$params

幸運を!

于 2013-04-08T08:31:40.310 に答える
0

解決策を見つけました。SQLクエリ部分だけですが、かなり高速でシンプルに見えます:

// takes ~1.25ms to complete (on average)
function str_replace_nth($haystack, $needle, $occurrence, $replacement) {
    $tmp = explode($needle, $haystack);

    if ($occurrence > sizeof($tmp)) {
        return $haystack;
    } else {
        $tmp[$occurrence - 1] .= "{$replacement}{$tmp[$occurrence]}";
        unset($tmp[$occurrence]);
        return implode($needle, $tmp);
    }
}
于 2013-04-08T08:21:43.747 に答える