给定一组id $galleries = array(1,2,5)我想要一个SQL查询,它在WHERE子句中使用数组的值,如:
SELECT *
FROM galleries
WHERE id = /* values of array $galleries... eg. (1 || 2 || 5) */
Run Code Online (Sandbox Code Playgroud)
如何生成此查询字符串以用于MySQL?
扼杀一个简单的数组
看起来像这样
$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);
Run Code Online (Sandbox Code Playgroud)
那会回来的
lastname,email,phone
Run Code Online (Sandbox Code Playgroud)
很棒,所以我可能会这样做
$array = array('lastname', 'email', 'phone');
$comma_separated = implode("','", $array);
$comma_separated = "'".$comma_separated."'";
Run Code Online (Sandbox Code Playgroud)
现在我有我想要的漂亮的csv字符串
'lastname','email','phone'
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点,我觉得应该有一个可选参数implode我错过了什么?
假设我有一个数组:
$elements = array('foo', 'bar', 'tar', 'dar');
Run Code Online (Sandbox Code Playgroud)
然后我想建立一个DELETE INSQL查询:
$SQL = "DELETE FROM elements
WHERE id IN ('" . implode(',', $elements) . "')";
Run Code Online (Sandbox Code Playgroud)
问题是element数组中的id不是单独引用的.IE查询看起来像:
$SQL = "DELETE FROM elements
WHERE id IN ('foo,bar,tar,dar');
Run Code Online (Sandbox Code Playgroud)
解决这个问题的最佳方式是什么?
我的网站相当广泛,我最近刚切换到PHP5(称我为大器晚成).
我之前的所有MySQL查询都是这样构建的:
"SELECT * FROM tablename WHERE field1 = 'value' && field2 = 'value2'";
Run Code Online (Sandbox Code Playgroud)
这使它非常简单,友好.
我出于明显的安全原因,现在正试图切换到mysqli,并且SELECT * FROM在bind_param需要特定参数时,我很难弄清楚如何实现相同的查询.
这句话是否已成为过去?
如果是,如何处理涉及大量列的查询?我真的需要每次都输入它们吗?
你会如何在PHP中编写一个准备好的MySQL语句,每次都需要不同数量的参数?这种查询的一个例子是:
SELECT `age`, `name` FROM `people` WHERE id IN (12, 45, 65, 33)
Run Code Online (Sandbox Code Playgroud)
该IN子句id每次运行时都会有不同数量的s.
我脑子里有两种可能的解决方案,但想看看是否有更好的方法.
可能的解决方案1使语句接受100个变量,并使用保证不在表中的虚拟值填充其余变量; 多次调用超过100个值.
可能的解决方案2不要使用准备好的声明; 构建并运行查询严格检查可能的注入攻击.
想象一下,我们有一个查询:
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)
但现在我必须手动对结果进行排序.我有什么好的选择吗?
我有一个充满随机内容项ID的数组.我需要运行一个mysql查询(数组中的id进入WHERE子句),使用数组中的每个ID,按照它们出现在所述数组中的顺序.我该怎么做?
对于数组中的每个ID,这将是一个UPDATE查询.
我正在使用预处理语句将一些旧代码移动到新的msqli接口,我在使用包含IN子句的SQL语句时遇到问题.我通常会这样做:
$ids = '123,535,345,567,878'
$sql = "SELECT * FROM table WHERE id IN ($ids)";
$res = mysql_query($sql);
Run Code Online (Sandbox Code Playgroud)
将其转换为mysqli和预处理语句我尝试了许多解决方案:
$ids = '123,535,345,567,878'
$ids = implode($ids,',');
$result = $msqli->prepare("SELECT foo,blar FROM table WHERE id IN (?));
$result->bind_param("i", $ids);
$result->execute();
Run Code Online (Sandbox Code Playgroud)
上面的操作失败并计算了数组中的元素数量并改变了SQL字符串中的问号数量,并且对数组中的每个元素调用bind_parm也失败了.仅使用逗号分隔的字符串也会失败.
我在谷歌上找不到好的文档,你怎么解决这个问题?
请看下面我的代码.我试图将参数数组绑定到我准备好的语句中.我一直在网上浏览,可以看到我必须使用call_user_func_array,但无法让它工作.我得到的错误是:"第一个参数应该是一个有效的回调,'数组'被给出"我可能是错的,但我假设第一个参数可以是一个数组,也许这个错误信息是误导性的.我认为问题是我的阵列在某种程度上是错误的.谁能看到我做错了什么?谢谢.
$type = array("s", "s");
$param = array("string1","anotherstring");
$stmt = $SQLConnection->prepare("INSERT INTO mytable (comp, addl) VALUES (?,?)");
$params = array_merge($type, $param);
call_user_func_array(array(&$stmt, 'bind_param'), $params);
$SQLConnection->execute();
Run Code Online (Sandbox Code Playgroud) 我必须使用INoperator 从数据库中选择一些行.我想用准备好的声明来做.这是我的代码:
<?php
$lastnames = array('braun', 'piorkowski', 'mason', 'nash');
$in_statement = '"' . implode('", "', $lastnames) . '"'; //"braun", "piorkowski", "mason", "nash"
$data_res = $_DB->prepare('SELECT `id`, `name`, `age` FROM `users` WHERE `lastname` IN (?)');
$data_res->bind_param('s', $in_statement);
$data_res->execute();
$result = $data_res->get_result();
while ($data = $result->fetch_array(MYSQLI_ASSOC)) {
...
}
?>
Run Code Online (Sandbox Code Playgroud)
但是,尽管数据库中存在所有数据,但不返回任
还有一个:如果我$in_statement直接传递查询并执行它,将返回数据.所以问题出现在准备上.
我在谷歌寻找这个问题,但并没有"成功".我的代码出了什么问题?
谢谢您的帮助!