Используйте следующую строку. showDiv()
будет вызывать функцию сразу после выполнения этой строки.
$('a.test').bind("click", showDiv);
Это то же самое, что было задано в этом вопросе: Могу ли я привязать массив к условию IN ()?
Ответ заключался в том, что для переменной в [in
], вам нужно будет построить запрос самостоятельно.
Однако вы можете использовать список, разделенный запятыми, с помощью find_in_set
, хотя для больших наборов данных это будет иметь значительное влияние на производительность, поскольку каждое значение в таблице должно быть отлито для типа char.
Например:
select users.id
from users
join products
on products.user_id = users.id
where find_in_set(cast(products.id as char), :products)
Или, в качестве третьего варианта вы можете создать определенную пользователем функцию, которая разбивает список разделенных запятыми (см. http://www.slickdev.com/2008/09/15/mysql-query-real-values -из-разделитель разделенных-строковые идентификаторы / [/ д2]). Вероятно, это лучший вариант для трех, особенно если у вас много запросов, которые полагаются на предложения in(...)
.
Лучшая подготовленная инструкция, которую вы, вероятно, могли бы найти в подобной ситуации, похожа на следующее:
SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products IN (?,?,?,?,?,?,?,?)
Затем вы пройдете через свои значения и привяжите их к подготовленному оператору, убедившись, что что существует такое же количество вопросительных знаков, сколько значений, которые вы связываете.
вам нужно предоставить такое же количество? s в IN как количество значений в вашем массиве $ values
, это можно сделать легко, создав массив? s как
$in = join(',', array_fill(0, count($values), '?'));
и использовать этот массив $ в вашем разделе IN
. Это будет динамически предоставлять вам индивидуальный массив из-за вашего измененного массива $ values
Вы можете сделать это очень легко. Если у вас есть массив значений для вашего оператора IN () EG:
$test = array(1,2,3);
Вы можете просто сделать
$test = array(1,2,3);
$values = count($test);
$criteria = sprintf("?%s", str_repeat(",?", ($values ? $values-1 : 0)));
//Returns ?,?,?
$sql = sprintf("DELETE FROM table where column NOT IN(%s)", $criteria);
//Returns DELETE FROM table where column NOT IN(?,?,?)
$pdo->sth = prepare($sql);
$pdo->sth->execute($test);
Хороший способ справиться с этой ситуацией - использовать str_pad
, чтобы поместить ?
для каждого значения в запросе SQL. Затем вы можете передать массив значений (в вашем случае $values
) в качестве аргумента для выполнения:
$sql = '
SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products.id IN ('.str_pad('',count($values)*2-1,'?,').')
';
$sth = $dbh->prepare($sql);
$sth->execute($values);
$user_ids = $sth->fetchAll();
Таким образом, вы получаете больше преимуществ от использования подготовленных операторов, а не вставляете значения непосредственно в SQL.
PS. Результаты возвращают повторяющиеся идентификаторы пользователей, если продукты с указанными идентификаторами разделяют идентификаторы пользователей. Если вам нужны только уникальные идентификаторы пользователей, я предлагаю изменить первую строку запроса на SELECT DISTINCT users.id
count($values)*2-1
. В противном случае вы можете использовать что-то вроде str_repeat('?,',count($values)-1).'?'
, если хотите.
– ghbarratt
3 June 2013 в 09:54
implode(',', array_fill(1,count($values),'?'))
, потому что меньше вероятность ошибок по отдельности, и вам не нужно обрабатывать последний элемент по-разному.
– Bill Karwin
13 February 2014 в 21:35
rtrim( str_reapeat('?,', count($values)), ',')
– ivanhoe
24 July 2014 в 07:47
Пожалуйста, попробуйте вот так:
WHERE products IN(REPLACE(:products, '\'', ''))
С уважением
Если выражение основано на пользовательском вводе без привязки значений с помощью bindValue (), экспериментальный SQL не может быть отличным выбором. Но вы можете сделать это безопасным, проверив синтаксис ввода с REGEXP MySQL.
Например:
SELECT *
FROM table
WHERE id IN (3,156)
AND '3,156' REGEXP '^([[:digit:]]+,?)+$'
Ниже приведен пример привязки неизвестного количества столбцов записи к значениям для вставки.
public function insert($table, array $data)
{
$sql = "INSERT INTO $table (" . join(',', array_keys($data)) . ') VALUES ('
. str_repeat('?,', count($data) - 1). '?)';
if($sth = $this->db->prepare($sql))
{
$sth->execute(array_values($data));
return $this->db->lastInsertId();
}
}
$id = $db->insert('user', array('name' => 'Bob', 'email' => 'foo@example.com'));
1,2,3,4
верен, но1, 2, 3, 4
НЕ. – R Picheta 1 December 2016 в 18:12