PHP: переменные можно передавать по ссылке в str_replace ()?

Я создал функцию для печати подготовленной-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 он отлично работает.

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


person Dexter    schedule 30.04.2011    source источник


Ответы (3)


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

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

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

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

person VoteyDisciple    schedule 30.04.2011
comment
Действительно, OP неправильно понял, что на самом деле делает параметр $count. Это выходной параметр, а не входной. - person Lightness Races in Orbit; 30.04.2011
comment
Совершенно верно; изменил мой пример, чтобы проиллюстрировать это, и добавил объяснение. - person VoteyDisciple; 30.04.2011
comment
О, я вижу. Значит, нет возможности ограничить количество замен, выполняемых с помощью str_replace ()? - person Dexter; 30.04.2011
comment
Неа. str_replace() не имеет такой возможности. Как вы уже отметили, preg_replace() делает. - person VoteyDisciple; 30.04.2011

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

person Explosion Pills    schedule 30.04.2011
comment
Это также относится к $count с preg_replace, но параметр $count для preg_replace является пятым, а не четвертым. OP использовал $limit с preg_replace, который делает что-то еще. - person Lightness Races in Orbit; 30.04.2011

Переписываю из 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);
person nobjta_9x_tq    schedule 28.02.2018