【问题标题】:details on mysqli_multi_query()?mysqli_multi_query() 的详细信息?
【发布时间】:2021-04-26 11:09:48
【问题描述】:

我是 php 新手。我正在尝试执行以下查询。我知道我必须使用mysqli_multi_query,但到目前为止我所有的尝试都给了我error。如何执行这些查询?我已阅读并尝试运行其他失败的示例。

<?php

include_once 'connect.php';

$user_values = json_encode($_POST['user_values']);//get a json object
$data = json_decode($user_values);



$sql = "";

if (isset($data->phone)) {
    $sql .= "CALL new_company_phone('$data->name', $data->phone)";
}
/*procedure that inserts value of "phone" to the corresponding "name" row */

if (isset($data->street)) {
    $sql .= "CALL new_company_street('$data->name', '$data->street')";
}

if (isset($data->street_num)) {
    $sql  .= "CALL new_company_street_num('$data->name' , $data->street_num)";
}

if(isset($data->city)){
    $sql .= "CALL new_company_city('$data->name', '$data->city')";
  }

  if(isset($data->country)){
    $sql .=  "CALL new_company_country('$data->name', '$data->country')";
  }

  /* execute multi query */
if (!mysqli_multi_query($con, $sql)) {
   echo "error"; }

【问题讨论】:

  • 我认为您需要以分号结束每个查询。我不是指您在 PHP 代码行末尾已有的分号,而是 inside 字符串。此外,看起来您对 SQL 注入攻击很开放。
  • 为什么需要使用mysqli_multi_query()?你可以打几个电话到mysqli_query()mysqli_multi_query() 使跟踪结果集和错误变得困难。我注意到您的最后一个电话似乎缺少程序名称。 FWIW,您最好编写一个更新过程来处理所有这些不同的更改,而不是编写多个并多次调用本质上是一个更新的内容。
  • 我强烈建议不要使用mysqli_multi_query()。我从未见过任何合法的使用它,它只会让事情变得更难。你也不能使用准备好的语句,所以你打开了 SQL 注入。
  • 您似乎可以通过一个查询完成所有这些过程所做的一切......
  • 同意...看起来这可能只是一个单独的 INSERT 查询而不是一整套过程的工作。他们到底是做什么的?

标签: php mysqli mysqli-multi-query


【解决方案1】:

恰恰相反!你永远不应该使用mysqli_multi_query()!如果您认为您发现了此功能的好用处,那么您应该重新考虑您的方法。

您应该使用带有参数绑定的预处理语句。每个CALL() 应该是一个单独的语句。如果需要,您可以创建一个函数以便更轻松地调用每个函数。

例如:

function callSP(mysqli $mysqli, string $sql, array $params) {
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param(str_repeat("s", count($params)), ...$params);
    $stmt->execute();
}

if (isset($data->phone)) {
    callSP($con, "CALL new_company_phone(?,?)", [$data->name, $data->phone]);
}

if (isset($data->street)) {
    callSP($con, "CALL new_company_street(?,?)", [$data->name, $data->street]);
}
// and so on...

很难说您的存储过程实际上做了什么。您可能需要根据它们是否返回结果以及它们是否使用游标来调整从 PHP 调用它们的方式。一般来说,我建议尽可能避免使用存储过程;你可以直接在 PHP 中做同样的事情。

【讨论】:

  • 我工作的一个地方有一个庞大而复杂的数据库,还有一个完整的团队来管理它。他们提供了一组存储过程供我们其他程序员在访问数据库时使用。我们在任何时候都被明确禁止使用 SQL 原语。这个想法是为了保护数据库完整性免受恶意 PHP 代码的影响。它在这方面工作得很好,但有时我们必须对我们用于某些工作的 SP 进行创新,因为编写新的 SP 可能需要几个月的时间。
猜你喜欢
  • 2018-06-27
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
相关资源
最近更新 更多