9

文字列内の n 番目のオカレンス (プレースホルダー) を置き換えるシンプルで高速なソリューションが必要です。

たとえば、SQL クエリの n 番目の疑問符は、指定された値に置き換える必要があります。

$subject = "SELECT uid FROM users WHERE uid = ? or username = ?";

だから、私は次のような関数が必要str_replace_nth($seach, $replace, $subject, $nth)で、2番目の疑問符の場合は次のように呼び出す必要がありますstr_replace_nth("?", $username, $subject, 2);

何か案は?

PS PDO を使用するように勧めないでください。私はFDO (Facebook Data Object)に取り組んでいるので、PDO に似たインターフェイスを備えたライブラリですが、FQL 用です。

重要なお知らせ!最初の置換後にクエリが変更され、インデックスが失われるため、このアプローチは悪いことがわかりました。(夜遅くにプログラミングしているときに悪いアプローチが発生します:() @GolezTrol がコメントで言及しているように、一度にすべてを置き換えることをお勧めします。

4

4 に答える 4

15

これがあなたが求めた機能です:

$subject = "SELECT uid FROM users WHERE uid = ? or username = ?";

function str_replace_nth($search, $replace, $subject, $nth)
{
    $found = preg_match_all('/'.preg_quote($search).'/', $subject, $matches, PREG_OFFSET_CAPTURE);
    if (false !== $found && $found > $nth) {
        return substr_replace($subject, $replace, $matches[0][$nth][1], strlen($search));
    }
    return $subject;
}

echo str_replace_nth('?', 'username', $subject, 1);

注:$nthはゼロ ベースのインデックスです。

ただし、プレースホルダーを置き換えるには、次のようなものを使用することをお勧めします。

$subject = "SELECT uid FROM users WHERE uid = ? or username = ?";

$args = array('1', 'steve');
echo vsprintf(str_replace('?', '%s', $subject), $args);
于 2013-11-11T13:41:52.867 に答える
6

疑問符を使用する代わりに、そのようなマーカーを使用しないでください:

$subject = "SELECT uid FROM users WHERE uid = :uid or username = :username";
$parameters = array(
    ':uid' => 42,
    ':username' => 'John',
);
$subject = str_replace(array_keys($parameters), $parameters, $subject);
于 2013-11-11T13:09:09.277 に答える
0

あなたの解決策はどれもうまくいかなかったので、これを作成しました:

$sql1 = "SELECT * FROM allegro_user WHERE User_Emp_Nb = ? AND User_Activ_status = ?";
$sql2 = "SELECT * FROM allegro_user WHERE User_Emp_Nb = :emp_nb AND User_Activ_status = :activ";

function prepare_query($sql, $args) {
    foreach ($args as $key => $value) {
        if (is_numeric($key)) {
            $sql = preg_replace('/\?/', "'" . $value . "'", $sql, 1);
        } else {
            $sql = str_replace($key, "'" . $value . "'", $sql);
        }
    }
    return $sql;

}

tab($sql1);
$sql = prepare_query($sql1, array('0216313', 'A'));
tab($sql1);

tab($sql2);
$sql = prepare_query($sql2, array(':emp_nb' => '0216313', ':activ' => 'A'));
tab($sql2);

tab() は、印刷に使用する単なる関数です。

echo '<pre>';
print_r($tab);
echo '</pre>';
于 2015-11-10T16:00:37.023 に答える