PHP - создать функцию выпуска - PullRequest
0 голосов
/ 14 февраля 2011

Я пытаюсь понять этот код и не могу: (

$time = date('Y-m-d', strtotime('-30 days'));
$what = create_function('$a', 'return $a.'.'"'." AND date > '$time'".'"'.';');

Почему переменная $time успешно передается в этой созданной функции, но когда я пытаюсь:

$limit = 10;
$what = create_function('$a', 'return '.'"'." LIMIT '$limit'".'"'.';');

$limit нет?

ps: если я попробую $what = create_function('$a', 'return '.'"'." LIMIT 10".'"'.';');, это сработает ...

Ответы [ 6 ]

2 голосов
/ 14 февраля 2011

Ваш код кажется немного запутанным, когда вы объединяете строки, попробуйте более простой подход:

create_function('$a', sprintf('return "LIMIT %d"',$limit));

если вы не возражаете, я спрашиваю, почему вы создаете функцию для возврата простой строки?

2 голосов
/ 14 февраля 2011

Код может быть значительно упрощен:

$what = create_function('$a', "return \"LIMIT $limit\";");

или

$what = create_function('$a', 'return "LIMIT ' .  $limit .'";');

Код должен работать.Обратите внимание, что число после LIMIT не должно быть заключено в кавычки в синтаксисе SQL.

Но когда вы создаете функцию, вы также можете передать ей $limit в качестве параметра:

$what = create_function('$limit', 'return "LIMIT $limit";');
$str = $what(10);

или вообще не использовать create_function и просто выполнить конкатенацию строк напрямую:

$str = 'LIMIT ' . $limit;
1 голос
/ 14 февраля 2011

Прежде всего, мне интересно, почему вы используете create_function? Если есть какой-либо шанс (и он обычно есть), вам следует стараться его избегать, поскольку это обычно приводит к очень небрежному коду.

Первое, что я заметил, это то, что ваш второй пример ничего не делает с $a:

$what = create_function('$a', 'return '.'"'." LIMIT '$limit'".'"'.';');

Вероятно, должно быть:

$what = create_function('$a', 'return $a . '.'"'." LIMIT '$limit'".'"'.';');

Кроме того, при объединении строк попробуйте окружить . пробелами. Это сделает ваш код более читабельным (и, следовательно, отладочным). И наконец, будьте осторожны с двойными и одинарными кавычками:)

1 голос
/ 14 февраля 2011

Я только что проверил ваш второй код, и он работает, правильно передавая $limit:

<?php
$limit = 10;
$what = create_function('$a', 'return '.'"'." LIMIT '$limit'".'"'.';');
echo $what(2);// note: `2` was randomly chosen, and used because $what expects an argument
// result: ` LIMIT '10'`
?>

Приведенную выше строку $what можно переписать как:

$what = create_function('$a', 'return "' . " LIMIT '$limit'" . '";');

Остерегайтесь, что вы случайно не напишите его как (обратите внимание на символы кавычки вокруг $limit:

$what = create_function('$a', 'return "' . ' LIMIT "$limit"' . '";');

В этом случае $limit не заменяется на 10 (значение $limit).

1 голос
/ 14 февраля 2011

Трудно читать и отличий между ' и " в вашем примере.

Попробуйте это:

$what = create_function('$a', "return \"LIMIT $limit;\""); 

а также

$what = create_function('$a', 'return \'LIMIT $limit;\''); 

Или

$what = create_function('$a', 'return "LIMIT '.$limit.';"'); // most clear, I think

Вы можете использовать \ в качестве экранирующего символа, это означает, что следующий символ после этого не будет интерпретироваться как заключительная кавычка, если это текущий символ кавычки.

Пример:

echo '\''; // will output '
echo '\"'; // will output \"
echo "\""; // will output "
0 голосов
/ 05 декабря 2011

В create_function, $limit в одинарных кавычках;либо вы должны включить его в двойные кавычки ("LIMIT $limit"), либо использовать оператор конкатенации (.) (например: '".$limit."').

...