【问题标题】:SQL Server Query not executing as expected PHPSQL Server 查询未按预期执行 PHP
【发布时间】:2017-12-01 20:39:24
【问题描述】:

我在使用 ajax 实现 jquery 自动完成时遇到了困难,同样的功能适用于另一个表,但在 2 个表(sales_man,Cashcustomer)中,它的返回空数组但第一个表(customerMaster)工作正常,并将每个客户列为其请求. 我的代码

myApp.js

$('#custName').autocomplete({ 
      minLength: 1,
      autoFocus:true,
      source: function( request, response ) {

          $.ajax({
              url: "/test/ajax/ajaxOpRespond.php",
              data: {action:'Get_CashCust_Code', code:request.term},
              dataType:'JSON',
              type: "POST",
              success: function( data ) {
                var result = [];

                if(data.length > 0){
                  for(var i=0;i<data.length;i++){  

                  result[i] = { "value" :data[i].CUST.CUST_NAME+" ("+data[i].CUST.TELE_NO+")", 
                 "custName":data[i].CUST.CUST_NAME,
                 "custtel1":data[i].CUST.TELE_NO,


                };
                  }
                }      
                else{
                  alert("jesha mesha");
                  $('#custType').val("new");
                }                                     
                  response(result);
              },
              error: function(xhr, textStatus, errorThrown){                    
               alert("fail"+errorThrown);
              var result = [];
              response( result );
          }
          });
      },
      select: function( event, ui ) {
        $("#custName").val(ui.item.custName);

        $('#custTel1').val(ui.item.custtel1);$('#custTel1').attr("readonly","true");
        $('#custType').val("old");



          return false;
       }
    });

ajaxController.php

case 'Get_CashCust_Code':
            $code = $_POST['code'];

            $msql = "SELECT [ID]
  ,[CUST_NAME]
  ,[TELE_NO] FROM [dbo].[tbl_CashCustomer_Master] WHERE [CUST_NAME] LIKE '%{$code}%' ;";
            $stmt = sqlsrv_query( $conn, $msql);
            if( $stmt === false ) {
                die( print_r( sqlsrv_errors(), true));
                    }
            if( sqlsrv_fetch( $stmt ) === false || sqlsrv_has_rows( $stmt ) === false) {
                    die( print_r( sqlsrv_errors(), true));
                    }
                    $rows = array();

            while( $r = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)) {
                $rows[] = array('CUST' => $r);

            }
            sqlsrv_free_stmt( $stmt);

            echo json_encode($rows);


            break;

output on Server studio

在 ajax 请求时它只返回 '[]'

请帮忙

【问题讨论】:

  • 这很容易受到sql注入攻击
  • 那是request.term?
  • @Psi 我知道一旦完成,我将修补所有安全漏洞
  • 检查您的浏览器控制台是否有错误。在您的浏览器网络选项卡中检查 ajax 请求实际返回的内容。如果这不正确,那么服务器端可能有问题。这是您可以自己进行的所有基本调试。
  • @Forbs 是搜索输入值

标签: php jquery ajax sql-server-2012 sqlsrv


【解决方案1】:

经过数小时的搜索和尝试,当我发布我的问题时,我发现了我的问题我添加了同一个客户 2 次,只有一个在自动完成中列出,这是因为我同时执行并获取了 2 次查询

     case 'Get_CashCust_Code':
                    $code = $_POST['code'];

                    $msql = "SELECT [ID]
          ,[CUST_NAME]
          ,[TELE_NO] FROM [dbo].[tbl_CashCustomer_Master] WHERE [CUST_NAME] LIKE '%{$code}%' ;";
                    $stmt = sqlsrv_query( $conn, $msql);
                    if( $stmt === false ) {
                        die( print_r( sqlsrv_errors(), true));
                            }
    /*sqlsrv_fetch( $stmt ) is fetching all rows */         
if( sqlsrv_fetch( $stmt ) === false || sqlsrv_has_rows( $stmt ) === false)  {
                            die( print_r( sqlsrv_errors(), true));
                            }
                            $rows = array();

     /*sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC) fetching rows for the second time*/              
 while( $r = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC)) {
                        $rows[] = array('CUST' => $r);

                    }
                    sqlsrv_free_stmt( $stmt);

                    echo json_encode($rows);


                    break;

通过阅读解决方案 here 他提到了我理解的执行机制,当执行时我的指针从 1 开始而不是 0

在下面引用他对该问题的回答

sqlsrv_fetch_array() 方法检索记录并推进 光标加一。您正在循环浏览您的第 190 行的记录 while 循环,但在第 21 行你有这个:

$auditData = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC),

所以你已经获取了第一条记录。当你击中 在第 190 行循环,您已经在记录 2。

您有几个选择。一种是将您的 while 循环更改为 do/while 循环:

做 { ... } 而 ($row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))

您需要将第 21 行(及相关行)更改为 $row = ... 而不是 $auditData = ...

或者,您可以在启动 main 之前重置指针 环形。不记得如何使用 SqlServer 驱动程序执行此操作,但是 快速谷歌应该让你走上正轨。

我真的很累,和我改变时一样的问题

  if( sqlsrv_fetch( $stmt ) === false || sqlsrv_has_rows( $stmt ) === false) {
                    die( print_r( sqlsrv_errors(), true));
                    }

/* removed the first fetch */
     if(sqlsrv_has_rows( $stmt ) === false) {
                        die( print_r( sqlsrv_errors(), true));
                        }

现在它可以正常工作了,感谢您的帮助和@Psi 感谢您通知我 SQL 注入攻击

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    相关资源
    最近更新 更多