Он работает для тривиальных случаев, и вы можете расширить его с помощью «автоматической генерации подготовленного заявления», однако он всегда имеет свои пределов.
Подход in () может быть достаточно хорош для некоторых случаев, но не для защиты от ракеты:)
Ракетно-защитное решение состоит в том, чтобы передать произвольное количество параметров в отдельный вызов (например, путем передачи клока параметров), а затем иметь представление (или любой другой способ) для представления их в SQL и использовать в вашем месте критерии.
Вариант грубой силы здесь http://tkyte.blogspot.hu/2006/06/varying-in-lists.html
Однако, если вы можете использовать PL / SQL, этот беспорядок может стать довольно опрятным.
function getCustomers(in_customerIdList clob) return sys_refcursor is
begin
aux_in_list.parse(in_customerIdList);
open res for
select *
from customer c,
in_list v
where c.customer_id=v.token;
return res;
end;
Затем вы можете передать произвольное количество идентификаторов клиентов, разделенных запятыми, в параметре и:
Трюк здесь:
Вид выглядит так:
create or replace view in_list
as
select
trim( substr (txt,
instr (txt, ',', 1, level ) + 1,
instr (txt, ',', 1, level+1)
- instr (txt, ',', 1, level) -1 ) ) as token
from (select ','||aux_in_list.getpayload||',' txt from dual)
connect by level <= length(aux_in_list.getpayload)-length(replace(aux_in_list.getpayload,',',''))+1
, где aux_in_list.getpayload ссылается на исходную строку ввода.
Возможным подходом было бы передать массивы pl / sql (поддерживаемые только Oracle), однако вы можете ' t использовать их в чистом SQL, поэтому шаг преобразования всегда необходим. Преобразование не может быть выполнено в SQL, поэтому, в конце концов, самым эффективным решением является передача clob со всеми параметрами в строке и преобразование его в представление.
Пока ваша PHP-версия может обрабатывать большие целые числа, то есть если вы используете 64-разрядную версию PHP (что-то , отличное от Windows ), у json_decode
нет проблем с it:
$json = '{"foo":9223372036854775807}';
$obj = json_decode($json);
$json2 = json_encode($obj);
var_dump(PHP_INT_MAX, $obj, $json2);
int(9223372036854775807)
object(stdClass)#1 (1) {
["foo"]=>
int(9223372036854775807)
}
string(27) "{"foo":9223372036854775807}"
Если целые значения, которые вам нужно обрабатывать, превышают PHP PHP_INT_MAX
, вы просто не можете представлять их в родных типах PHP. Так что у вас нет головоломки; вы не можете использовать собственные типы для отслеживания правильного типа, и вы не можете подставлять другие типы (например, строки вместо целых чисел), потому что это неоднозначно, когда кодирование возвращается к JSON.
В этом случае вам придется изобретать собственный механизм отслеживания правильных типов для каждого свойства и обрабатывать такую сериализацию с помощью пользовательского кодировщика / декодера. Например, вам нужно написать собственный JSON-декодер, который может декодироваться в пользовательский класс, например new JsonInteger('9223372036854775808')
, и ваш пользовательский кодер распознает этот тип и закодирует его на значение JSON 9223372036854775808
.
В PHP нет такой вещи.