加入收藏 | 设为首页 | 会员中心 | 我要投稿 北几岛 (https://www.beijidao.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – 如何使用mysqli编写一个安全的SELECT查询,该查询具有可

发布时间:2021-08-28 05:09:11 所属栏目:大数据 来源: https://www.jb51.cc
导读:我希望得到一些帮助来执行我的代码中的foreach. 我将多个值发布到用户名:as username [0] = user1,user2 但我的foreach给我的结果只有最后一个条目或没有. $companyname = $_POST['companyname'];$username_grab = $_POST['username'];$username = implode(

我希望得到一些帮助来执行我的代码中的foreach.

我将多个值发布到用户名:as username [0] = user1,user2

但我的foreach给我的结果只有最后一个条目或没有.

$companyname = $_POST['companyname'];
$username_grab = $_POST['username'];
$username = implode(",", $username_grab);

foreach ($username_grab as $value){
    $value = $username_grab;

    $sql = "select * from linked_user where username = '$value' and company_name = '$companyname'";
    $res = MysqLi_query($conn,$value);
    while($row = MysqLi_fetch_array($res)){
        $returnValue['username'] = $row['username'];
        $returnValue['user_scid'] = $row['user_scid'];
    }
}
echo json_encode($returnValue);
?>

解决方法:

您要执行的任务是具有可变数量占位符的预准备语句.这在PDO中更简单,但我将向您展示MysqLi面向对象的样式方法.无论如何,始终打印一个json编码数组,以便您的接收脚本知道所期望的数据类型.

我有一个片段,包括一整套诊断和错误检查.我没有测试过这个脚本,但它与this post of mine非常相似.

if (empty($_POST['companyname']) || empty($_POST['username'])) {  // perform any validations here before doing any other processing
    exit(json_encode([]));
}

$config = ['localhost', 'root', '', 'dbname'];  // your connection credentials or use an include file
$values = array_merge([$_POST['companyname']], explode(',', $_POST['username']));  // create 1-dim array of dynamic length
$count = sizeof($values);
$placeholders = implode(',', array_fill(0, $count - 1, '?'));  // -1 because companyname placeholder is manually written into query
$param_types = str_repeat('s', $count);
if (!$conn = new MysqLi(...$config)) {
    exit(json_encode("MysqL Connection Error: <b>Check config values</b>"));  // $conn->connect_error
}
if (!$stmt = $conn->prepare("SELECT user_scid, user_scid FROM linked_user WHERE company_name = ? AND username IN ({$placeholders})")) {
    exit(json_encode("MysqL Query Syntax Error: <b>Failed to prepare query</b>"));  // $conn->error
}
if (!$stmt->bind_param($param_types, ...$values)) {
    exit(json_encode("MysqL Query Syntax Error: <b>Failed to bind placeholders and data</b>"));  // $stmt->error;
}
if (!$stmt->execute()) {
    exit(json_encode("MysqL Query Syntax Error: <b>Execution of prepared statement Failed.</b>"));  // $stmt->error;
}
if (!$result = $stmt->get_result()) {
    exit(json_encode("MysqL Query Syntax Error: <b>Get Result Failed.</b>")); // $stmt->error;
}
exit(json_encode($result->fetch_all(MysqLI_ASSOC)));

如果你不想要所有那些诊断条件和注释的膨胀,这里是相同的裸骨应该执行相同的:

if (empty($_POST['companyname']) || empty($_POST['username'])) {
    exit(json_encode([]));
}

$values = explode(',', $_POST['username']);
$values[] = $_POST['companyname'];
$count = count($values);
$placeholders = implode(',', array_fill(0, $count - 1, '?'));
$param_types = str_repeat('s', $count);

$conn = new MysqLi('localhost', 'root', '', 'dbname');
$stmt = $conn->prepare("SELECT user_scid, user_scid FROM linked_user WHERE username IN ({$placeholders}) AND company_name = ?");
$stmt->bind_param($param_types, ...$values);
$stmt->execute();
$result = $stmt->get_result();
exit(json_encode($result->fetch_all(MysqLI_ASSOC)));

(编辑:北几岛)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读