PHP、XAMPP、SQL SERVER 2012 中 array_push() 的等效 sqlsrv_

Posted

技术标签:

【中文标题】PHP、XAMPP、SQL SERVER 2012 中 array_push() 的等效 sqlsrv_【英文标题】:Equivalent sqlsrv_ for array_push() in PHP, XAMPP, SQL SERVER 2012 【发布时间】:2019-11-24 22:15:24 【问题描述】:

sqlsrv_ 中的array_push() 是否有等效代码?喜欢sqlsrv_array_push()。我不确定它是否有,我还没有阅读关于该代码的文档。有替代方案吗?

我尝试重新编码,这就是我目前所得到的。

编辑:添加 conn.php

<?php
$serverName = "XXXXXX\XXXXXX";
$connectionInfo = array( "Database"=>"XXXXXX", "UID"=>"XXXXXX", "PWD"=>"XXXXXX");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

if( $conn ) 
     echo "Connection established.<br />";
else
     echo "Connection could not be established.<br />";
     die( print_r( sqlsrv_errors(), true));

?> 

编辑:添加$and

$and = 'AND YEAR(date) = '.$year;
$months = array();
$ontime = array();
$late = array();
for( $m = 1; $m <= 12; $m++ ) 
    $sql = "SELECT * FROM CHECKINOUT WHERE MONTH(CHECKTIME) = '$m' AND CHECKTYPE = 'I' $and";
    $oquery = $conn->query($sql);
    array_push($ontime, sqlsrv_num_rows($oquery));

    $sql = "SELECT * FROM CHECKINOUT WHERE MONTH(CHECKTIME) = '$m' AND CHECKTYPE = 'O' $and";
    $lquery = $conn->query($sql);
    array_push($late, sqlsrv_num_rows($lquery));

    $num = str_pad( $m, 2, 0, STR_PAD_LEFT );
    $month =  date('M', mktime(0, 0, 0, $m, 1));
    array_push($months, $month);

这是我遇到的错误。

警告:sqlsrv_num_rows() 期望参数 1 是资源,布尔值在 C:\xampp\htdocs\path\tofile\home.php 第 198 行给出

【问题讨论】:

什么是$conn$and?您的查询失败,因此查询中的某处可能存在语法错误。启用错误报告并找出问题所在。 不,SQL Server 的 PHP Driver 没有这样的功能。你能解释一下为什么需要这样的功能吗?可能还有另一种方法可以实现您的结果。 @Qirel $and = 'AND YEAR(date) = '.$year; 附录。 @Zhorov 我正在尝试为array_push($ontime, sqlsrv_num_rows($oquery)); 的所有可用数据制作一行,我使用这些数据制作图表。 使用sqlsrv_errors() 找出查询失败的原因。显然查询失败,因为$Xquery 是一个布尔值。我不知道sqlsrv_ 有一个 OOP 接口。 【参考方案1】:

说明:

如果我理解您的逻辑,您需要将$conn-&gt;query($sql); 替换为sqlsrv_query() 调用。函数 sqlsrv_? 是 SQL Server 的 PHP 驱动程序的一部分,不是面向对象的。

示例:

下一个示例基于您的代码,可能有助于获得您的预期结果:

<?php
$and = 'AND YEAR(CHECKTIME) = '.$year;
$months = array();
$ontime = array();
$late = array();
for( $m = 1; $m <= 12; $m++ ) 
    $sql = "SELECT * FROM CHECKINOUT WHERE MONTH(CHECKTIME) = '$m' AND CHECKTYPE = 'I' $and";
    $oquery = sqlsrv_query($conn, $sql, array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET));
    if ($oquery === false) 
        echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
        exit;
       
    array_push($ontime, sqlsrv_num_rows($oquery));


    $sql = "SELECT * FROM CHECKINOUT WHERE MONTH(CHECKTIME) = '$m' AND CHECKTYPE = 'O' $and";
    $lquery = sqlsrv_query($conn, $sql, array(), array("Scrollable" => SQLSRV_CURSOR_KEYSET));
    if ($lquery === false) 
        echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
        exit;
       
    array_push($late, sqlsrv_num_rows($lquery));

    $num = str_pad( $m, 2, 0, STR_PAD_LEFT );
    $month =  date('M', mktime(0, 0, 0, $m, 1));
    array_push($months, $month);
?>

注意事项:

您也可以考虑使用参数化查询:

<?php
$y = 2019;
$months = array();
$ontime = array();
$late = array();
for( $m = 1; $m <= 12; $m++ ) 
    $sql = "SELECT * FROM CHECKINOUT WHERE YEAR(CHECKTIME) = ? AND MONTH(CHECKTIME) = ? AND CHECKTYPE = 'I'";
    $oquery = sqlsrv_query($conn, $sql, array(&$y, &$m), array("Scrollable" => SQLSRV_CURSOR_KEYSET));
    if ($oquery === false) 
        echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
        exit;
       
    array_push($ontime, sqlsrv_num_rows($oquery));

    $sql = "SELECT * FROM CHECKINOUT WHERE YEAR(CHECKTIME) = ? AND MONTH(CHECKTIME) = ? AND CHECKTYPE = 'O'";
    $lquery = sqlsrv_query($conn, $sql, array(&$y, &$m), array("Scrollable" => SQLSRV_CURSOR_KEYSET));
    if ($lquery === false) 
        echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
        exit;
       
    array_push($late, sqlsrv_num_rows($lquery));

    $num = str_pad( $m, 2, 0, STR_PAD_LEFT );
    $month =  date('M', mktime(0, 0, 0, $m, 1));
    array_push($months, $month);

?>

【讨论】:

这样更好,谢谢。我现在只需要在$y = 2019; 中设置$year;,因为它是一个下拉选项。 @pjustindaryll 很高兴为您提供帮助!我为未来的读者添加了sqlsrv 标签。谢谢。

以上是关于PHP、XAMPP、SQL SERVER 2012 中 array_push() 的等效 sqlsrv_的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:对 SQL SERVER 2012 的非对象 XAMPP 上的成员函数 query() 调用

如何使用xampp将sql server与php连接起来?

如何在xampp中使用php连接sql server

使用 html 和 php 从 xampp sql server 获取数据

如何使用 PHP 显示 SQL Server 表数据?

无法从 codeigniter 2.1.4 连接到 SQL Server 2012