0
  • PHPとSQLSRVドライバーの使用

患者IDに基づいてSQLServerデータベースのバイナリイメージを表示する必要があります。患者IDと画像は2つの異なるデータベースにあります。

最初のデータベースから、入力した患者IDに基づいて画像IDを照会し、その結果をarray()に追加します。次に、このIDの配列を使用して、2番目のデータベースから画像を取得します。

問題:SQLステートメントのWHERE caluseで配列を使用すると、次のエラーが発生します。

注意:配列から文字列への変換...

私はこれに本当に迷っています。

以下は私のコードです:

<?php
// ------------------------------------------------------------
// SCANNED IMAGES SEARCH CLASS
// used to retreive binary images from sql server database
// ------------------------------------------------------------

class ScannedImages extends DbConnect {
    // ------------------------------------------------------------
    // PROPERTIES
    // ------------------------------------------------------------
    public $imageOutput = NULL;

    // ------------------------------------------------------------
    // GET SCANNED IMAGE IDS FROM RIS BASED ON PATIENT ID
    // ------------------------------------------------------------
    public function getImagesByPatientId($sentPatientId) {

        // ------------------------------------------------------------
        // 1. GET IMAGE IDS AND PUT THEM IN AN ARRAY
        // ------------------------------------------------------------

        // connect to [[[FusionRIS]]] database
        $conn1 = $this->sqlSrvConnect_2();

        // get image IDs based on patient ID
        $sql1 = "SELECT DocMgtImageID FROM tbDocMgtImagesAffiliations WHERE PatientID = $sentPatientId";
        $stmt1 = sqlsrv_query($conn1, $sql1);

        // exit if there is problem retrieving the data
        if($stmt1 === false) {
            die(var_dump(sqlsrv_errors(), true));
        }

        // image id array
        $imageIdArray = array();

        // loop through the results
        while($row1 = sqlsrv_fetch_array($stmt1, SQLSRV_FETCH_ASSOC)) {
            $imageIdArray[] = $row1['DocMgtImageID'];
        }

        // ------------------------------------------------------------
        // 2. GET IMAGES BASED ON ARRAY OF IMAGE IDS
        // ------------------------------------------------------------

        // connect to [[[DocMgmt]]] database
        $conn2 = $this->sqlSrvConnect_1();

        // get images based on ids in array 33482
        $sql2 = "SELECT ImageData FROM tbDocMgtImages WHERE DocMgtImageID IN ($imageIdArray)";
        $stmt2 = sqlsrv_query($conn2, $sql2);

        // exit if there is problem retrieving the data
        if($stmt2 === false) {
            die(var_dump(sqlsrv_errors(), true));
        }

        // convert binary to image
        function data_uri($file, $mime) {
            $base64 = base64_encode($file);
            return "data:$mime;base64,$base64";
        }

        // counter for image display
        $count = 0;

        // loop through the results
        while($row2 = sqlsrv_fetch_array($stmt2, SQLSRV_FETCH_ASSOC)) {
            $count++;
            $this->imageOutput .= '<a href="#"><img src="'. data_uri($row2['ImageData'], 'image/jpeg') .'" alt=""><span>'. $count .'</span></a>';
        }

        // free the statement and connection resources
        sqlsrv_free_stmt($stmt1);
        sqlsrv_close($conn1);

        sqlsrv_free_stmt($stmt2);
        sqlsrv_close($conn2);
    }
}
4

3 に答える 3

1

これは、配列を文字列として解釈しようとしているためです。次のような操作を行って、この文字列への変換を明示的に行う必要があります。

$sql2 = "SELECT ImageData FROM tbDocMgtImages WHERE DocMgtImageID IN (" . implode(',', $imageIdArray) . ")";
于 2012-12-24T21:26:13.217 に答える
0

このようなクエリで生の配列を送信するだけです。のような期待される文字列に変換する必要があります1,2,3,...

$query = sprintf("SELECT ImageData FROM tbDocMgtImages WHERE DocMgtImageID IN (%s)", implode(',', $imageIdArray));

ここで、これらはユーザー入力ではなく、他のDBのINTEGERタイプの列であると想定しているため、引用符は必要ありませんが、それ以外の場合は、内破する前に各値をエスケープする必要があります。

于 2012-12-24T21:25:54.263 に答える
0

$ imageIdArrayをSQLに渡す場合は、最初にそれを内包する必要があります

于 2012-12-24T21:25:23.243 に答える