如何参数化包含IN
具有可变数量参数的子句的查询,比如这个?
SELECT * FROM Tags
WHERE Name IN ('ruby','rails','scruffy','rubyonrails')
ORDER BY Count DESC
Run Code Online (Sandbox Code Playgroud)
在此查询中,参数的数量可以是1到5之间的任何值.
我不希望为此(或XML)使用专用存储过程,但如果有一些特定于SQL Server 2008的优雅方式,我对此持开放态度.
我知道如何将列表映射到字符串:
foostring = ",".join( map(str, list_of_ids) )
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用以下内容将该字符串转换为IN子句:
cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))
Run Code Online (Sandbox Code Playgroud)
我需要的是使用MySQLDB安全地完成同样的事情(避免SQL注入).在上面的示例中,因为foostring不作为参数传递来执行,所以它很容易受到攻击.我还必须在mysql库之外引用并转义.
(有一个相关的SO问题,但那里列出的答案要么对MySQLDB不起作用,要么易受SQL注入攻击.)
我的SQL代码非常简单.我正在尝试从数据库中选择一些数据,如下所示:
SELECT * FROM DBTable
WHERE id IN (1,2,5,7,10)
Run Code Online (Sandbox Code Playgroud)
我想知道如何在select之前声明列表(在变量,列表,数组或其他内容中),而select中只使用变量名,如下所示:
VAR myList = "(1,2,5,7,10)"
SELECT * FROM DBTable
WHERE id IN myList
Run Code Online (Sandbox Code Playgroud) 想象一下,我们有一个查询:
SELECT * FROM somewhere WHERE `id` IN(1,5,18,25) ORDER BY `name`;
Run Code Online (Sandbox Code Playgroud)
以及要获取的ID数组: $ids = array(1,5,18,25)
准备好的陈述,建议准备一个陈述并多次调用:
$stmt = $mysqli->prepare('SELECT * FROM somewhere WHERE `id`=?;');
foreach ($ids as $id){
$stmt->bind_params('i', $id);
$stmt->exec();
}
Run Code Online (Sandbox Code Playgroud)
但现在我必须手动对结果进行排序.我有什么好的选择吗?
我不能让这个工作.我现在已经花了很多时间.
这有效:
$mysqli = new mysqli("localhost", "root", "root", "db");
if(!$mysqli || $mysqli->connect_errno)
{
return;
}
$query_str= "SELECT name FROM table WHERE city IN ('Nashville','Knoxville')";
$query_prepared = $mysqli->stmt_init();
if($query_prepared && $query_prepared->prepare($query_str))
{
$query_prepared->execute();
Run Code Online (Sandbox Code Playgroud)
但是我不能让它与这样的bind_param一起工作:
$query_str= "SELECT name FROM table WHERE city IN (?)";
$query_prepared = $mysqli->stmt_init();
if($query_prepared && $query_prepared->prepare($query_str))
{
$cities= explode(",", $_GET['cities']);
$str_get_cities= "'".implode("','", $get_cities)."'"; // This equals 'Nashville','Knoxville'
$query_prepared->bind_param("s", $cities);
$query_prepared->execute();
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我也试过call_user_func_array,但似乎无法使语法正确.任何帮助将不胜感激!
编辑:我已经严格尝试了moskito-x的建议和大量的例子列在这里以及其他在SO和随机网站上,没有任何作品.我认为问题可能是PHP 5.4,这就是我的MAMP现在设置的.
我需要做一个简单的查询
$array_of_ids = array();
//poulate $array_of_ids, they don't come from another db but from Facebook
//so i can't use a subquery for the IN clause
$wpdb->prepare("SELECT id from table where id IN (%d, %d)", $array_of_ids [0], $array_of_ids [1]);
Run Code Online (Sandbox Code Playgroud)
问题是,如果我在数组中有200个元素,处理这个问题的正确方法是什么?我必须用200手动构建查询%d
吗?我需要这个查询,因为我必须与facebook数据"同步"我的数据库,我必须检查我在数据库中的用户是否存在,更新那些存在的,插入新用户并删除那些不是我的朋友.
如何一次更新数百行?
喜欢:
UPDATE table SET a = ? WHERE b = ? AND c = 1
但对于许多行.该?
参数是数组...
我读了这个答案,但它使用CASE而我认为我不能这样做......
现在我有这样的事情:
foreach($values as $key => $value)
$res = $pdo->prepare('UPDATE table SET a = ? WHERE b = ? AND c = 1');
$res->execute(array($value, $key));
}
Run Code Online (Sandbox Code Playgroud) 我想将 javascript 数组 ids = [ 378, 464 ] 转换为 MySQL 成功解析的数组。
我的 SQL 查询包括这样的数组:
Do something WHERE id IN ("472", "467").
Run Code Online (Sandbox Code Playgroud)
此查询适用于 MySQL Workbench。
我正在努力获得所需结构的数组。我在我的 api 中尝试了以下 javascript 结构,但我无法让它工作。
("378", "464")
[ 378, 464 ]
('472', '467')
Run Code Online (Sandbox Code Playgroud)
MYSQL 错误信息:
code: 'ER_PARSE_ERROR',
errno: 1064,
Run Code Online (Sandbox Code Playgroud) 因此,我尝试在本地托管的网页上练习 SQL 注入。我对 SQL 很陌生,尤其是 SQL 注入。我已经做了一些研究,将新条目注入表中,但是当我尝试执行时,它似乎不起作用。
首先,我的网页是登录的。我有用户名和密码(显然)并且可以在不附加任何 SQL 注入的情况下登录。但是当我将注入代码添加到用户名框中时,它不起作用。例子:
username: admin'; insert into hall values (3,'https://google.com','Google'); --
password: 123321
Run Code Online (Sandbox Code Playgroud)
在我的大厅表中,有 3 个条目:id、链接、目的地。ID 是一个整数,链接和目标是 varchars。
我需要做什么才能成功注入并将此条目添加到数据库中?是需要输入正确的用户名和密码,还是只输入用户名,还是其他什么?
mysql ×6
php ×5
sql ×3
mysqli ×2
sql-server ×2
api ×1
arrays ×1
bindparam ×1
javascript ×1
mergesort ×1
parameters ×1
pdo ×1
python ×1