Возможно, есть способ адаптировать то, что вы делаете, к событиям перетаскивания, чтобы достичь этого результата, но я не смог заставить его работать. Вот что-то, что делает то же самое, но с mousedown
, mouseup
и mousemove
.
var crop = document.querySelector(".image .crop");
crop.addEventListener("mousedown", function(event) {
document.onmousemove = function(event) {
moveBox(event);
};
document.onmouseup = function(event) {
stopMoving(event);
}
});
function moveBox(event) {
event.preventDefault();
var mouseoffset = [event.clientX, event.clientY];
crop.style.left = mouseoffset[0] + "px";
crop.style.top = mouseoffset[1] + "px";
}
function stopMoving(event) {
document.onmousemove = null;
document.onmouseup = null;
}
.image {
position: relative;
width: 400px;
height: 400px;
overflow: hidden;
background: #C00;
}
.image .crop {
position: absolute;
width: 150px;
height: 150px;
background: rgba(64, 168, 36, 1);
}
<div class="image">
<div class="crop" draggable="true"></div>
</div>
Вы указываете, что "это - SQL для запроса с одним параметром" - который не будет работать, когда Вы захотите много параметров. Это - боль для контакта с, конечно. Два других изменения к тому, что уже было предложено:
1) Используйте DBI-> кавычка вместо заполнителей.
my $sql = "select foo from bar where baz in ("
. join(",", map { $dbh->quote($_) } @bazs)
. ")";
my $data = $dbh->selectall_arrayref($sql);
2) Используйте ORM, чтобы сделать этот вид низкоуровневого материала для Вас. DBIx:: Класс или Rose:: DB:: Объект, например.
Я делаю что-то как:
my $dbh = DBI->connect( ... );
my @vals= ( 1,2,3,4,5 );
my $sql = 'SELECT * FROM table WHERE id IN (' . join( ',', map { '?' } @vals ) . ')';
my $sth = $dbh->prepare( $sql );
$sth->execute( @vals );
И все же другой способ создать SQL состоит в том, чтобы использовать что-то как SQL:: Краткий обзор ....
use SQL::Abstract;
my $sql = SQL::Abstract->new;
my $values = [ 1..3 ];
my $query = $sql->select( 'table', '*', { id => { -in => $values } } );
say $query; # => SELECT * FROM table WHERE ( id IN ( ?, ?, ? ) )
В Python я всегда заканчивал тем, что делал что-то как:
query = 'select * from junk where junk.id in ('
for id in junkids:
query = query + '?,'
query = query + ')'
cursor.execute(query, junkids)
..., который по существу создает запрос с один'?' для каждого элемента списка.
(и если существуют другие параметры там также, необходимо удостовериться, что Вы выстраиваете в линию вещи правильно при выполнении запроса)
[редактирование для создания кода легче понять для людей не-Python. Существует ошибка, где запрос будет иметь дополнительную запятую после последнего?, который я оставлю внутри, потому что фиксация его просто объединила бы общее представление в облако]
С плоскостью DBI
необходимо было бы создать SQL сами, как предложено выше. DBIx:: Простой (обертка для DBI
) делает это для Вас автоматически использование'??' нотация:
$db->query("select * from foo where bar in (??)", @values);
Если Вам не нравится карта там, можно использовать 'x' оператор:
my $params = join ', ' => ('?') x @foo;
my $sql = "SELECT * FROM table WHERE id IN ($params)";
my $sth = $dbh->prepare( $sql );
$sth->execute( @foo );
круглые скобки необходимы вокруг'?' потому что это вынуждает 'x' быть в контексте списка.
Read "perldoc perlop" и поиск 'Двоичного файла "x"' для получения дополнительной информации (это находится в разделе "Multiplicative Operators").
Я использую DBIx:: DWIW. Это содержит функцию под названием InList (). Это создаст часть SQL, который необходим для списка. Однако это только работает, если у Вас есть весь свой SQL в программе вместо внешней стороны в отдельном файле.