Вас может заинтересовать использование класса CI Active Record :
Помимо простоты, основным преимуществом использования функций Active Record является то, что он позволяет создавать базу данных.независимые приложения, так как синтаксис запроса генерируется каждым адаптером базы данных.Это также позволяет выполнять более безопасные запросы, так как значения автоматически экранируются системой .
Ваш переписанный запрос будет выглядеть так (при условии, что $id
- это массив):
$this->db->where_in('toy_id', $id)->get('toys');
В сторону: Я признаю, что я немного сбит с толку, так как похоже, что $ids
будет более подходящим именем переменной, и то, как вы используете его в запросе, Я бы предположил, что это строка ...
Если активная запись не ваша вещь, вам также может пригодиться Привязки запросов :
Вторичное преимущество использования привязок состоит в том, что значения автоматически экранируются , создавая более безопасные запросы.Вам не нужно помнить, чтобы вручную экранировать данные;двигатель делает это автоматически для вас.
РЕДАКТИРОВАТЬ : Оглядываясь назад на это, похоже, это то, что вы пытаетесь сделать.В этом случае попробуйте заменить:
$sql = "select * from toys t where t.toy_id in ($id)";
на:
$sql = "select * from toys t where t.toy_id in (?)";
И передать $id
в качестве второго аргумента query()
, но в виде строки, разделенной запятой (implode(',', $id)
если $id
действительно массив).
В противном случае вы можете использовать $this->db->escape_str()
.
$ this-> db-> escape_str () ThisФункция экранирует данные, передаваемые ей, независимо от типа.
Вот выдержка из исходного кода драйвера mysql, которая может помочь вам расслабиться.
function escape_str($str, $like = FALSE)
{
if (is_array($str))
{
foreach ($str as $key => $val)
{
$str[$key] = $this->escape_str($val, $like);
}
return $str;
}
// continued...
Он перебирает массивы и экранирует их значения.
Действительно, кажется, что $this->db->escape
не будет работать для массивов.
$ this-> db-> escape ()Эта функция определяет тип данных так, что она может экранировать только строковые данные.
Вот источник:
function escape($str)
{
if (is_string($str))
{
$str = "'".$this->escape_str($str)."'";
}
elseif (is_bool($str))
{
$str = ($str === FALSE) ? 0 : 1;
}
elseif (is_null($str))
{
$str = 'NULL';
}
return $str;
}
Похоже, он игнорирует массивы.
В любом случае, надеюсь, вы найдете решение, которое работает для вас.Мой голос за активную запись.