PHP: «... переменные можно передавать по ссылке» в str_replace ()? - PullRequest
21 голосов
/ 30 апреля 2011

Я создал функцию для печати строки готового оператора-sql с переменными в ней, основываясь на том, что я нашел в этом другом вопросе StackOverflow .

Вот мой код:

foreach($params as $idx => $param) {
    if ($idx == 0) continue;
    $sql = str_replace('?', "'" . $param . "'", $sql, 1);
}
printError($sql);

Когда я запускаю это, я получаю: Fatal error: Only variables can be passed by reference для строки 3. Однако, когда я использую

$sql = preg_replace('/\?/', "'" . $param . "'", $sql, 1);

для строки 3 работает нормально.

Есть идеи, почему?

Ответы [ 3 ]

35 голосов
/ 30 апреля 2011

Самый последний параметр, count, передается по ссылке.Вы можете увидеть это в описании на http://us.php.net/str_replace, где перед переменной стоит &.

Это означает, что вы не можете использовать там литерал 1.Вам нужно будет сделать:

$sql = str_replace('?', "'" . $param . "'", $sql, $count);
echo $count;

Теперь на экране отобразится количество замененных экземпляров.

2 голосов
/ 30 апреля 2011

Посмотрите документацию для preg_replace и str_replace, и вы поймете почему.Четвертый аргумент str_replace должен быть передан по ссылке, но это не относится к preg_replace.

0 голосов
/ 28 февраля 2018

Я переписываю с VoteyDisciple

$sqlLogin = "SELECT * FROM users inner join role on users.roleId = role.id WHERE email=?1 and password=?2";
function makeSql() {
    $args = func_get_args();
    if(isset($args[1])) {
        $len = sizeof($args);
        //var_dump($args);
        $sql = $args[0];
        for ($index = 1; $index < $len; $index++) {
            $sql = str_replace('?'.strval($index), "'" . $args[$index] . "'", $sql);
        }
        return $sql;
    }
    return $args[0];
}
$sql = makeSql($sqlLogin, $myusername1, $mypassword);
$result = mysqli_query($con, $sql);
...