【问题标题】:Executing stored procedure in php laravel在 php laravel 中执行存储过程
【发布时间】:2020-06-10 06:29:53
【问题描述】:

我正在使用 Laravel 7,我想显示存储过程的结果。我的代码如下。当我在 SQL Server 中使用参数执行存储过程时,它正在显示数据。但是在 Laravel 应用程序中没有显示数据。

请帮我找出问题。

$serverName = env("DB_HOST");
$connectionInfo = array( "Database"=>env("DB_DATABASE"), "UID"=>env("DB_USERNAME"), "PWD"=>env("DB_PASSWORD") );
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false ) {
  die( print_r( sqlsrv_errors(), true));
}
$tsql= " EXEC USP_Daily_TA_Punching_Detailswith_OT '$employee','$datefrom','$dateto'";
$getResults= sqlsrv_query($conn, $tsql);
      $data = array();
      if ($getResults == FALSE)
      {
      echo '';
      }
      else {
       //$data[] ='';
      do
      {
        while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC))
        {
         $data[] = $row;
        }
      }
       while (sqlsrv_next_result($getResults));
      }
      if(count($data)>0){
       sqlsrv_free_stmt($getResults);
      $total_row = count($data);
     }

【问题讨论】:

  • 这能回答你的问题吗? How to execute Stored Procedure from Laravel
  • 嗯,这不完全是 Laravel 代码,因为您使用的是 PHP Driver for SQL Server 中的 sqlsrv_ 函数。您想在不使用 Laravel 方法的情况下修复此代码吗?
  • 我尝试使用 laravel,但它显示错误“SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]'000010993' 附近的语法不正确。(SQL: exec USP_Daily_TA_Punching_Detailswith_OT ('000010993','2020-06-01','2020-06-10'))"

标签: php sql-server laravel sqlsrv


【解决方案1】:

始终尝试在语句中使用参数来防止可能的 SQL 注入问题。作为附加说明,当您将日期值传递给 SQL Server 时,请使用明确的日期格式:

使用 PHP Driver for SQL Server 的示例:

<?php
// Connection
$serverName = env("DB_HOST");
$connectionInfo = array(
    "Database"=>env("DB_DATABASE"), 
    "UID"=>env("DB_USERNAME"), 
    "PWD"=>env("DB_PASSWORD")
);
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
    die(print_r(sqlsrv_errors(), true));
}

// Statement
$employee = '000010993';
$datefrom = '20200601'; 
$dateto   = '20200610';
$tsql     = "EXEC USP_Daily_TA_Punching_Detailswith_OT ?, ?, ?";
$params   = array($employee, $datefrom, $dateto);
$getResults = sqlsrv_query($conn, $tsql, $params);
if ($getResults === false) {
    die(print_r(sqlsrv_errors(), true));
}   

// Results
$data = array();
do {
    while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) {
        $data[] = $row;
    }
} while (sqlsrv_next_result($getResults));

// End
sqlsrv_free_stmt($getResults);
sqlsrv_close($conn);
$total_row = count($data);
?>   

使用 Laravel 的示例:

<?php

...
$employee = '000010993';
$datefrom = '20200601'; 
$dateto   = '20200610';
DB::select("SET NOCOUNT ON; EXEC USP_Daily_TA_Punching_Detailswith_OT ?, ?, ?", array($employee, $datefrom, $dateto));

...
?>

【讨论】:

  • 使用 PHP,当我打印 $data 时,没有数据..显示 [] 使用 laravel,它显示“SQLSTATE [IMSSP]:查询的活动结果不包含字段。(SQL: EXEC USP_Daily_TA_Punching_Detailswith_OT 000010993, 2020-06-01, 2020-06-10)"
  • @ManUtd 你能改变存储过程并将SET NOCOUNT ON作为过程的第一行吗?
  • @ManUtd 或执行 sqlsrv_next_result($getResults) 以跳过可能的信息消息:sqlsrv_next_result($getResults); while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) {$data[] = $row;}
  • 我认为存储过程有问题,当我更改为一些测试存储过程时,它可以工作,但是这个存储过程没有显示数据。我如何在 php 中查看存储过程中的错误。当我在 sql server 中执行存储过程时,我正在获取数据,但在我的应用程序中没有数据。
  • 通过使用 laravel,我在开头包含了 SET NOCOUNT ON。 DB::select("SET NOCOUNT ON; EXEC ......").现在它的工作!..谢谢@Zhorov
【解决方案2】:

尝试以下方法在 laravel 中调用存储过程

DB::select("call USP_Daily_TA_Punching_Detailswith_OT('".$employee."','".$datefrom."','".$dateto."')");

【讨论】:

  • 它显示“SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]'000010993' 附近的语法不正确。(SQL: call USP_Daily_TA_Punching_Detailswith_OT('000010993','2020 -06-01','2020-06-10'))"
  • 第一个参数可以不加引号试试,因为这里显示错误。
  • 同样的错误 "SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]'000010993' 附近的语法不正确。(SQL: call USP_Daily_TA_Punching_Detailswith_OT(000010993,'2020-06 -01','2020-06-10'))"
猜你喜欢
  • 2010-09-15
  • 2016-04-02
  • 2014-04-26
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多