如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--
,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
我正在使用PDO执行一个带有IN
子句的语句,该子句使用数组作为它的值:
$in_array = array(1, 2, 3);
$in_values = implode(',', $in_array);
$my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (".$in_values.")");
$my_result->execute();
$my_results = $my_result->fetchAll();
Run Code Online (Sandbox Code Playgroud)
上面的代码完全正常,但我的问题是为什么这不是:
$in_array = array(1, 2, 3);
$in_values = implode(',', $in_array);
$my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (:in_values)");
$my_result->execute(array(':in_values' => $in_values));
$my_results = $my_result->fetchAll();
Run Code Online (Sandbox Code Playgroud)
此代码将返回my_value
等于$in_array
(1)中第一项的项,但不返回数组中的其余项(2和3).
我愿意打赌,这是一个非常简单的答案,因为我是SQL的菜鸟.
表1列第1列(标准1)第2列(标准2)第3列(度量标准1)
表2列第1列(标准1)第2列(标准2)第3列(特定于table2.criteria2的度量标准2)
对于表中的每个标准1,可以存在1-5个值的标准2.
当我在这里使用join语句时(假设我在此之前将表1标识为One):
Select WeddingTable, TableSeat, TableSeatID, Name, Two.Meal
FROM table1 as One
inner join table2 as Two
on One.WeddingTable = Two.WeddingTable and One.TableSeat = Two.TableSeat
Run Code Online (Sandbox Code Playgroud)
我只得到其中一个标准1 /标准2组合,即使我知道有3个或4个事实.我如何获得所有组合?
在有婚礼的情况下,表1基本上是座位表,表2是每个桌子/座位选择的用餐选项.表1具有方便的TableSeatID,但表2没有可比较的ID.
样本数据:
结果需要显示所有4条线,分别是WeddingTable 001的3个座位和WeddingTable 002的1个座位.
期望的结果:
我有和两个值的数组,我想在选择查询中使用它与sql IN运算符.
这是我桌子的结构
id comp_id
1 2
2 3
3 1
Run Code Online (Sandbox Code Playgroud)
我有一个$arr
有两个值的数组Array ( [0] => 1 [1] => 2 )
我想获取comp_id 1和comp_id 2的记录.所以我编写了以下查询.
SELECT * from table Where comp_id IN ($arr)
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)
但现在我必须手动对结果进行排序.我有什么好的选择吗?
我有一串id,如1,2,3,4,5,我希望能够列出mysql中包含该列表ID的所有行.
我假设最简单的方法是将字符串转换为数组然后匹配($ array)但它对我不起作用 - 没有错误等但它不返回任何行:
$string="1,2,3,4,5";
$array=array_map('intval', explode(',', $string));
$query=mysqli_query($conn, "SELECT name FROM users WHERE id IN ('".$array."')");
Run Code Online (Sandbox Code Playgroud)
如果我执行$ array的var_dump,我得到:
array(5) {
[0]=> int(1)
[1]=> int(2)
[2]=> int(3)
[3]=> int(4)
[4]=> int(5)
}
Run Code Online (Sandbox Code Playgroud)
知道我搞砸了吗?
码:
$friendsArray = array("zac1987", "peter", "micellelimmeizheng1152013142");
$friendsArray2 = join(', ',$friendsArray);
$query120 = "SELECT picturemedium FROM users WHERE username IN ('$friendsArray2')";
echo $query120;
Run Code Online (Sandbox Code Playgroud)
这是输出:
SELECT picturemedium FROM users WHERE username IN ('zac1987, peter, micellelimmeizheng1152013142')
Run Code Online (Sandbox Code Playgroud)
它失败了,因为用户名没有被"zac1987","peter","mice ......"等单引号包裹.如何用单引号包装每个用户名?
我在WHERE子句中使用数组创建SQL查询时遇到问题.
例如:
我的阵列:
$myarray[1] = "hi";
$myarray[2] = "there";
$myarray[3] = "everybody";
Run Code Online (Sandbox Code Playgroud)
我的MySQL声明:
SELECT * FROM myTable WHERE title='".$myarray[]."'
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这一点?我自己解决了这个问题:
for(...) {
$where = $where." title='".$myarray[$count]."' OR ";
}
$where = substr($where , 0, -3);
.....
SELECT * FROM myTable WHERE ".$where."
Run Code Online (Sandbox Code Playgroud)
但是如果我的数组中有数千个条目,那么SQL语句会变得太大而且很慢,对吧?
谢谢
可能重复:
PHP/MYSQL在WHERE子句中使用数组
我有一个名为的数组$ids
:
Array ( [0] => 14 [1] => 15 [2] => 16 [3] => 17 [4] => 18 [5] => 19)
Run Code Online (Sandbox Code Playgroud)
我想从表Users
中选择ID
匹配数组上任何值的表.如何才能做到这一点?
我不能让这个工作.我现在已经花了很多时间.
这有效:
$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现在设置的.