【问题标题】:Why need to include connection file before every stored procedure为什么需要在每个存储过程之前包含连接文件
【发布时间】:2021-02-01 02:49:56
【问题描述】:

我有一个php 文件,它正在调用一些stored procedures

include "../../commonFilesForAll/db.php";
$tagQueryQcWaiting = "CALL qcWaitingQuery()";
$tagQueryQcWaitingExecute = mysqli_query($conn, $tagQueryQcWaiting);
$qcWaiting = mysqli_num_rows($tagQueryQcWaitingExecute);

$tagQueryQcFailed = "CALL qcFailedQuery()";
$tagQueryQcFailedExecute = mysqli_query($conn, $tagQueryQcFailed);
$qcFailed = mysqli_num_rows($tagQueryQcFailedExecute);

$tagQueryQcAssigned = "CALL qcAssignedQuery()";
$tagQueryQcAssignedExecute = mysqli_query($conn, $tagQueryQcAssigned);
$qcAssigned = mysqli_num_rows($tagQueryQcAssignedExecute);

但是当我给出上述方法时,它不起作用。我必须在每个查询之前包含连接文件,如下所示,才能使其工作如下所示

include "../../commonFilesForAll/db.php";
$tagQueryQcWaiting = "CALL qcWaitingQuery()";
$tagQueryQcWaitingExecute = mysqli_query($conn, $tagQueryQcWaiting);
$qcWaiting = mysqli_num_rows($tagQueryQcWaitingExecute);

include "../../commonFilesForAll/db.php";
$tagQueryQcFailed = "CALL qcFailedQuery()";
$tagQueryQcFailedExecute = mysqli_query($conn, $tagQueryQcFailed);
$qcFailed = mysqli_num_rows($tagQueryQcFailedExecute);

include "../../commonFilesForAll/db.php";  
$tagQueryQcAssigned = "CALL qcAssignedQuery()";
$tagQueryQcAssignedExecute = mysqli_query($conn, $tagQueryQcAssigned);
$qcAssigned = mysqli_num_rows($tagQueryQcAssignedExecute);

我的存储过程示例如下 qcWaitingQuery

BEGIN
  SELECT * FROM plannertags WHERE (`status` = '0' OR `status` = '2') 
  AND currentStage = '12' 
  AND assignedTo = '0' 
  AND handoverStatus = '0' 
  AND failedStatus = '0' 
  ORDER BY deliveryDate ASC;
END

qcFailedQuery

BEGIN
  SELECT * FROM plannertags t JOIN failedTable n on t.srNumber = n.plannerTagsSrNumber
  WHERE (t.status = 0 OR t.status = 2) 
  AND t.currentStage = '12' 
  AND t.assignedTo = '0' 
  AND t.handoverStatus = '0' 
  AND n.failedDepartment = '12' 
  AND n.status = '0' 
  AND n.latestTag='1' 
  ORDER BY t.deliveryDate ASC;
END

qcAssignedQuery

BEGIN
  SELECT *FROM plannertags t JOIN qctable n on t.srNumber = n.plannerTagsSrNumber
  WHERE (t.status = 0 OR t.status = 2) 
  AND t.currentStage = '12' 
  AND t.assignedTo = '12' 
  AND t.handoverStatus = '0' 
  AND n.failedStatus = '0' 
  AND n.qcHold != '1'
  ORDER BY t.deliveryDate ASC;
END

我的db.php文件如下

$servername = "111.11.11.111";
$username = "111";
$password = "111111";
$database = "111";

$conn = mysqli_connect($servername, $username, $password, $database);

if (!$conn) {
   die("Connection failed: " . mysqli_connect_error());
}

有人知道为什么会这样吗?

【问题讨论】:

    标签: php stored-procedures mysqli


    【解决方案1】:

    您不需要每次都打开连接。您的错误是您正在调用存储过程,但您没有获取所有结果。 SP 有一个隐藏的行为,它们总是在您在其中的 SELECT 语句之上返回结果。这意味着您需要正确获取两个结果,否则会出现不同步错误。

    在每次调用存储过程后获取第二个结果,它应该可以工作。

    include "../../commonFilesForAll/db.php";
    $tagQueryQcWaiting = "CALL qcWaitingQuery()";
    $tagQueryQcWaitingExecute = mysqli_query($conn, $tagQueryQcWaiting);
    $qcWaiting = mysqli_num_rows($tagQueryQcWaitingExecute);
    
    mysqli_next_result($conn); // fetch the empty result of SP call
    

    如果您正确配置了 mysqli,您会看到正确的不同步错误。您的连接脚本不正确。您必须始终启用错误报告。替换为:

    $servername = "111.11.11.111";
    $username = "111";
    $password = "111111";
    $database = "111";
    
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $conn = mysqli_connect($servername, $username, $password, $database);
    

    确保删除if 语句。您还应该设置正确的连接字符集。 Please read the manual for more information.

    【讨论】:

    • 谢谢达曼。我没有给出任何错误报告的原因是因为我不希望用户看到错误。我认为通过上述错误报告,有时用户甚至可以看到用户名和密码
    • @Anu 你把两件事混在一起了。错误报告应始终完全启用。但是,当站点上线时,应关闭设置 display_errors。见How to get the error message in MySQLi?
    • 好的。现在清楚了。我正在尝试从您提到的链接中找出在哪里设置display_errors
    猜你喜欢
    • 1970-01-01
    • 2014-03-15
    • 2017-04-18
    • 2017-06-02
    • 1970-01-01
    • 2019-06-04
    • 2015-07-28
    • 2015-08-19
    相关资源
    最近更新 更多