2017-12-01 18 views
0

jQueryオートコンプリートを実装しているときにajaxを使用すると、別のテーブルで同じ機能が動作しますが、2テーブル(sales_man、Cashcustomer)すべての顧客をその要求としてリストアップしてください。 AJAXリクエストに応じて 私のコードSQL Serverクエリが期待どおりに実行されていませんPHP

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

それだけを返す '[]'

+1

これは 'request.term'のSQLインジェクション攻撃 – Psi

+0

に対して脆弱ですか? – Forbs

+0

@Psiすべてのセキュリティ上の欠陥が修正されると、パッチが適用されることに気付きました。 –

答えて

0

を助けてください検索と試行時間後、私は私の質問を掲示したときに、私はここで本当の問題だったものを知らなかったし、それが空を返す理由を、よく私の実際の問題は、最初の行がありました、私の問題を発見しました私は2回だけは、私は彼が言及した hereソリューションを読み取ることで、同じ時間

 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; 

で2回実行し、クエリをフェッチしているため、これはオートコンプリートに上場したのと同じ顧客を追加したときの応答配列から除外私のポインタが1から始まるときに実行されるときの実行のメカニズム0

以下という問題が彼の答えを引用sqlsrv_fetch_array()メソッドは、レコードを検索し、いずれかによって カーソルを進めます。あなたは既に最初にフェッチしている

$ auditData = sqlsrv_fetch_array($ stmtは、SQLSRV_FETCH_ASSOC)、

:あなたはあなたの whileループにライン190上のあなたの記録をループしているが、ライン21には、これを持っています記録。あなたがライン190の ループに当たったら、既にレコード2になっています。

あなたはいくつかのオプションがあります。一つは、whileループ/やる にあなたのwhileループを変更することです:

が行う{...}中($行= sqlsrv_fetch_array($ stmtは、 SQLSRV_FETCH_ASSOC))あなたはライン21を変更する必要があります

$ auditData = ...の代わりに$ row = ...となるように設定することもできます。

ループを開始する前に、ポインタをリセットすることもできます。どのようにSqlServerドライバでそれを行うのか覚えていないが、 クイックグーグルは適切なトラックにあなたを設定する必要があります。

私は実際に疲れている間と同じ予想通り、私は

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

、今その作業罰金に

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

を変更したときだ問題、そして、あなたの助けと@Psiの感謝のために感謝を行いますSQLインジェクション攻撃を知らせるために

関連する問題