MSSQL データベースへのクエリを用意しました。Manager で実行すると、完全に正常に動作しますが、PHP スクリプトに行が返されないようです。最も問題のある部分は、おそらく次の列です。
Difference = t0.col1 - ISNULL((SELECT t1.col1 FROM table AS t1 WHERE t1.date =
(SELECT MAX(t2.date) FROM table AS t2 WHERE t2.date < t0.date)), 0)
または、次のようになります。
(SELECT NORMA FROM base2.dbo.ODB_S_PO WHERE <condition>)
MS SQL で PHP を使用する場合、サブクエリを使用できますか? これらのクエリは異なるデータベースを指すことができますか? 変数の定義など、PHP からの 1 つのクエリで複数のステートメントを並べることはできますか?
編集:完全なクエリの投稿:
SELECT t0.TA_DATA,
col1+' '+col2,
t0.TA_STAN_LICZNIKA,
Difference = t0.TA_STAN_LICZNIKA - ISNULL((SELECT t1.TA_STAN_LICZNIKA FROM tab1 AS t1 WHERE t1.TA_DATA =
(SELECT MAX(t2.TA_DATA) FROM tab1 AS t2 WHERE t2.TA_DATA < t0.TA_DATA AND t2.TA_ID_PJ = '03102')), 0),
t0.TA_ILE,
(SELECT NORMA FROM db2.dbo.ODB_S_PO WHERE KOD = '03102')
FROM tab1 AS t0
INNER JOIN tab2 ON t0.TA_ID_KI = KI_ID
WHERE t0.TA_ID_PJ = '03102' ORDER BY t0.TA_DATA DESC
これは完全なクエリです。1 つのデータベースを使用して、同じテーブルを 3 回参照して差を計算し、別のデータベースにアクセスして特定の変数を取得しようとしています。別のデータベースからの選択を省略し、別のクエリで変数を取得しても役に立ちません。
EDIT2: Management Studio で使用するアカウントと、Web インターフェイス専用のアカウントを使用してみました。提案に従って、これが(ほぼ)完全な PHP スクリプトです。
$car = $_POST['id'];
include '../bd.php';
$nazwa_hosta = '';
$username = '';
$passwd = '';
$baza = 'gps';
//print_r($_POST);
$res_dbase = new BD($nazwa_hosta, $username, $passwd, $baza);
$res_dbase->bd_polacz();
$query = "SELECT MARKA, NRR,
CONVERT(varchar, [DATE_TIME], 104) AS Dzien,
DATE_TIME,
CAST(DISTANCE AS FLOAT) / 1000 AS DIST,
Diff = CAST(t0.DISTANCE - ISNULL((SELECT t1.DISTANCE FROM reports AS t1 WHERE t1.ID =
(SELECT MAX(t2.ID) FROM reports AS t2 WHERE t2.ID < t0.ID AND t2.DEVICE_ID = t0.DEVICE_ID)), 0) AS FLOAT) / 1000,
IGNITION_SWITCH_STATE AS Stac,
SPEED,
KI_NAZWISKO+' '+KI_IMIE AS Kier
FROM Mediator.dbo.ODB_S_PO AS pojlist
INNER JOIN mikrostacje.dbo.MS_BLACK_BOX ON pojlist.KOD = '0'+CONVERT(VARCHAR, BB_ID_PJ)
INNER JOIN gps.dbo.reports AS t0 ON DEVICE_ID = BB_ID
INNER JOIN mikrostacje.dbo.MS_KIEROWCA ON KI_ID = (SELECT IDK_ID_KI FROM mikrostacje.dbo.MS_ID_KARTA_KIEROWCA WHERE IDK_RFID_NO = RFID)
WHERE KOD = '$car'
ORDER BY DATE_TIME DESC";
echo $query."<br />";
if(!($res_dbase->bd_zapytaj($query))) //the code fails here - otherwise I wouldn't get any message from the server. And the only message I get is that it changes the context to 'gps'
{
echo mssql_get_last_message();
}
$marka = "";
$nrr = "";
$result = "";
while(false !== ($row = $res_dbase->bd_pobierzTabliceAsocjacyjna()))
{
$marka = $row['MARKA'];
$nrr = $row['NRR'];
$result .= "<tr><td>".$row['Dzien']."</td><td>".$row['DATE_TIME']."</td><td>".$row['Dist']."</td><td>".$row['Diff']."</td><td>".$row['Stac']."</td><td>".$row['Kier']."</td></tr>".PHP_EOL;
}
$head = "<div style='text-align: center; margin: auto'><b>$nrr $marka</b><table>";
$result .= "</table></div>";
$echo = remove_pl($head.$result, "latin2"); // Removing Polish characters, since the target is encoded in Windows-1250
echo $echo;