2017-05-28 34 views
2

したがって、データベースからデータを取り出す2つのクエリがあります。しかし、私はPHPを使用して配列の違いを得るために、これらのデータを使用する必要があります。私はemployeeNameと指定の両方を配列に送り、その違いを取得したいと思います。私が使用している以下のコードは期待どおりに動作しません。この問題の解決策はありますか?2つの要素を持つ配列を使ってPHPで配列の違いを得る方法

あなたは構文の問題を抱えている、ここで

$row1[] = $rs1['employeeName, designation']; 

正しい方法は次のようになり

<?php 

header("Access-Control-Allow-Origin: *"); 
header("Content-Type: application/json; charset=UTF-8"); 

include_once 'config.php'; 

$sql1 = "SELECT employeeName, designation FROM t2o_mappings WHERE type = '". $_GET['type'] ."' AND employeeCompany = '".$_GET['employeeCompany']."'"; //System Data; 
$sql2 = "SELECT employeeName, designation FROM mappings_view WHERE uNo = '" . $_GET['uNo'] . "' AND uCompany = '" . $_GET['uCompany'] . "' AND type = '". $_GET['type'] ."' AND employeeCompany = '".$_GET['employeeCompany']."'"; //App Data; 
//WHERE uNo = '".$_GET['uNo']."' AND uCompany = '".$_GET['uCompany']."' 

$result1 = sqlsrv_query($conn, $sql1); 
$result2 = sqlsrv_query($conn, $sql2); 

$row1 = []; 
$row2 = []; 

while ($rs1 = sqlsrv_fetch_array($result1, SQLSRV_FETCH_ASSOC)) { 

    $row1[] = $rs1['employeeName, designation']; 
} 

while ($rs2 = sqlsrv_fetch_array($result2, SQLSRV_FETCH_ASSOC)) { 

    $row2[] = $rs2['employeeName, designation']; 
} 

print_r($row1); 
print_r($row2); 

$HaveSysNoApp = array_diff($row1, $row2); //Have in System, Not in App 
$HaveAppNoSys = array_diff($row2, $row1); //Have in App, Not in System 

echo 'HaveSysNoApp'; 
print_r($HaveSysNoApp); 
echo '$HaveAppNoSys'; 
print_r($HaveAppNoSys); 

?> 
+0

"私が使用した以下のコードは期待どおりに動作しません"という意味ですか?何がうまくいかない? – JazZ

答えて

2

$row1[] = [ 
    $rs1['employeeName'], 
    $rs1['designation'] 
]; 

しかしarray_diff()、それだけを扱うことができるため予告「の文字列変換に配列を」スロー一次元The PHP array_diff() documentation contains this note

注:

2つの要素があれば同等とみなされ、場合にのみ(文字列)$ elem1 ===(文字列)されている$のElem2。言い換えれば:文字列表現が同じ場合。

比較する多次元配列があるため、array_filter()関数を使用できます。例えば

$HaveSysNoApp = array_filter($row1, function ($item) use ($row2) { 
    return !in_array($item, $row2); 
}); 
+0

あなたが与えた解決策は正しいですが、配列の差異関数では機能しません。「Notice:38行目の文字列変換への配列」 –

+0

@AndrewJeromeBernard私の答えを編集しました。あなたの質問が解決した場合はお知らせください。ありがとうございます。 – JazZ

+0

ありがとう:D!これは完全に働いた!! @JazZ –

0

あなたはこのクエリを使用してデータベースに直接それを行うことができます(逆のチェックは同様であろう):

SELECT system.employeeName, system.designation 
FROM t2o_mappings AS system 
WHERE system.type = ? 
    AND system.employeeCompany = ? 
    AND NOT EXISTS (
    SELECT NULL 
    FROM mappings_view AS app 
    WHERE app.employeeName = system.employeeName 
     AND app.designation = system.designation 
     AND app.type = system.type 
     AND app.uNo = ? 
     AND app.uCompany = ? 
) 

これらの疑問符は、それが、ウィッヒ防止のクエリをパラメータ化しますSQLインジェクション(パラメータ値はクエリの一部ではないため、意味を変更できません)。

$params = [ 
    $_GET['type'], 
    $_GET['employeeCompany'], 
    $_GET['uNo'], 
    $_GET['uCompany'] 
]; 
$haveSysNoAppResult = sqlsrv_query($conn, $sql, $params); 
関連する問題