次の方法で共有


サンプル アプリケーション

AdventureWorks Product Reviews サンプル アプリケーションは、SQL Server Driver for PHP の機能を示すための Web アプリケーションです。このアプリケーションでは、キーワード入力による製品の検索、選択した製品のレビューの表示、選択した製品のレビューの書き込み、選択した製品の画像のアップロードなどを行うことができます。

サンプル アプリケーションの実行

  1. SQL Server Driver for PHP をインストールします。詳細については、「はじめに」を参照してください。

  2. このドキュメントの後半に示すコードを 2 つのファイル adventureworks_demo.php および photo.php にコピーします。

  3. adventureworks_demo.php ファイルと photo.php ファイルを Web サーバーのルート ディレクトリに配置します。

  4. ブラウザーで https://localhost/adventureworks_demo.php を起動してアプリケーションを実行します。

必要条件

AdventureWorks Product Reviews サンプル アプリケーションを実行するには、コンピューターが次の条件を満たしている必要があります。

  • システムが SQL Server Driver for PHP の要件を満たしている。詳細については、「システム要件 (SQL Server Driver for PHP)」を参照してください。
  • adventureworks_demo.php ファイルと photo.php ファイルが Web サーバーのルート ディレクトリに存在する。ファイルには、このドキュメントの後半に示すコードが含まれている必要があります。
  • SQL Server 2005 または SQL Server 2008 がローカル コンピューターにインストールされ、AdventureWorks データベースがアタッチされている。
  • Web ブラウザーがインストールされている。

使用例

AdventureWorks Product Reviews サンプル アプリケーションでは、以下の操作方法を示します。

  • Windows 認証を使用して SQL Server への接続を開く方法
  • sqlsrv_query を使用してパラメーター化されたクエリを実行する方法
  • sqlsrv_preparesqlsrv_execute の組み合わせを使用してパラメーター化されたクエリを準備して実行する方法
  • sqlsrv_fetch_array を使用してデータを取得する方法
  • sqlsrv_fetchsqlsrv_get_field の組み合わせを使用してデータを取得する方法
  • データをストリームとして取得する方法
  • データをストリームとして送信する方法
  • エラーを確認する方法

AdventureWorks Product Reviews サンプル アプリケーションでは、ユーザーが入力した文字列が名前に含まれる製品の製品情報がデータベースから返されます。ユーザーは、返された製品の一覧から製品を選択して、レビューの表示、画像の表示、画像のアップロード、レビューの書き込みなどを行うことができます。

adventureworks_demo.php という名前のファイルに次のコードを記述してください。

<!--=====================================================================
This file is part of a Microsoft SQL Server Shared Source Application.
Copyright (C) Microsoft Corporation.  All rights reserved.
 
THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
======================================================= *-->

<!--Note: The presentation formatting of the example application -->
<!-- is intentionally simple to emphasize the SQL Server -->
<!-- data access code.-->
<html>
<head>
<title>AdventureWorks Product Reviews</title>
</head>
<body>
<h1 align='center'>AdventureWorks Product Reviews</h1>
<h5 align='center'>This application is a demonstration of the 
                  Microsoft SQL Server 2005 Driver for PHP.</h5><br/>
<?php
$serverName = "(local)";
$connectionOptions = array("Database"=>"AdventureWorks");

/* Connect using Windows Authentication. */
$conn = sqlsrv_connect( $serverName, $connectionOptions);
if( $conn === false )
      { die( FormatErrors( sqlsrv_errors() ) ); }

if(isset($_REQUEST['action']))
{
   switch( $_REQUEST['action'] )
   {
       /* Get AdventureWorks products by querying against the 
          product name.*/
       case 'getproducts':
            $query = $_REQUEST['query'];
            $tsql = "SELECT ProductID, Name, Color, Size, ListPrice 
                    FROM Production.Product 
                    WHERE Name LIKE '%' + ? + '%' AND ListPrice > 0.0";
            $getProducts = sqlsrv_query( $conn,
                                         $tsql,
                                         array( $query ));
            if ( $getProducts === false)
            { die( FormatErrors( sqlsrv_errors() ) ); }

            $headings = array("Product ID",
                              "Product Name",
                              "Color",
                              "Size",
                              "Price");
             BeginProductsTable( "Query Results", $headings );

             $productCount = 0;
             while( $row = sqlsrv_fetch_array( $getProducts,
                                               SQLSRV_FETCH_ASSOC))
             {
                   PopulateProductsTable( $row );
                   $productCount++;
             }
             EndProductsTable();
             if ( $productCount == 0 )
             {
                   DisplayNoProdutsMsg();
             }
             GetSearchTerms( !null );

             /* Free the statement and connection resources. */
             sqlsrv_free_stmt( $getProducts );
             sqlsrv_close( $conn );
             break;

       /* Get reviews for a specified productID. */
       case 'getreview':
             GetPicture( $_REQUEST['productid'] );
             GetReviews( $conn, $_REQUEST['productid'] );
             sqlsrv_close( $conn );
             break;

       /* Write a review for a specified productID. */
       case 'writereview':
             DisplayWriteReviewForm( $_REQUEST['productid'] );
             break;

       /* Submit a review to the database. */
       case 'submitreview':
             /*Prepend the review so it can be opened as a stream.*/
             $comments = "data://text/plain,".$_REQUEST['comments'];
             $stream = fopen( $comments, "r" );
             $tsql = "INSERT INTO Production.ProductReview (ProductID,
                                                         ReviewerName,
                                                         ReviewDate,
                                                         EmailAddress,
                                                         Rating,
                                                         Comments) 
                    VALUES (?,?,?,?,?,?)";
           $params = array(&$_REQUEST['productid'],
                           &$_REQUEST['name'],
                           date("Y-m-d"),
                           &$_REQUEST['email'],
                           &$_REQUEST['rating'], 
                           &$stream);

           /* Prepare and execute the statement. */
           $insertReview = sqlsrv_prepare($conn, $tsql, $params);
           if( $insertReview === false )
           { die( FormatErrors( sqlsrv_errors() ) ); }
           /* By default, all stream data is sent at the time of
              query execution. */
           if( sqlsrv_execute($insertReview) === false )
           { die( FormatErrors( sqlsrv_errors() ) ); } 

           sqlsrv_free_stmt( $insertReview );
           GetSearchTerms( true );

         /*Display a list of reviews, including the latest addition. */
           GetReviews( $conn, $_REQUEST['productid'] );
           sqlsrv_close( $conn );
           break;

        /* Display a picture of the selected product.*/
        case 'displaypicture':
            $tsql = "SELECT Name 
                     FROM Production.Product 
                     WHERE ProductID = ?";
            $getName = sqlsrv_query($conn, $tsql, 
                                      array($_REQUEST['productid']));
            if( $getName === false )
            { die( FormatErrors( sqlsrv_errors() ) ); }
            if ( sqlsrv_fetch( $getName ) === false )
            { die( FormatErrors( sqlsrv_errors() ) ); }
            $name = sqlsrv_get_field( $getName, 0);
            DisplayUploadPictureForm( $_REQUEST['productid'], $name );
            sqlsrv_close( $conn );
            break;

        /* Upload a new picture for the selected product. */
        case 'uploadpicture':
            $tsql = "INSERT INTO Production.ProductPhoto (LargePhoto)
                     VALUES (?); SELECT SCOPE_IDENTITY() AS PhotoID";
            $fileStream = fopen($_FILES['file']['tmp_name'], "r");
            /* Turn off the default behavior of sending all stream data
               to the server at the time of query execution. */
            $options = array("SendStreamParamsAtExec"=>0);
            $uploadPic = sqlsrv_prepare($conn, $tsql, array(
                       array(&$fileStream, 
                             SQLSRV_PARAM_IN, 
                             SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY),
                             SQLSRV_SQLTYPE_VARBINARY('max'))),
                        $options);
            if( $uploadPic === false )
            { die( FormatErrors( sqlsrv_errors() ) );}
            if( sqlsrv_execute($uploadPic) === false )
            { die( FormatErrors( sqlsrv_errors() ) ); }

            /* Stream data to the database in chunks. */
           while( $success = sqlsrv_send_stream_data( $uploadPic))
           {
           }
   
           /*Skip the open result set (row affected). */
           $next_result = sqlsrv_next_result($uploadPic);
           if( $next_result === false )
           { die( FormatErrors( sqlsrv_errors() ) ); }
   
           /* Fetch the next result set. */
           if( sqlsrv_fetch($uploadPic) === false)
           { die( FormatErrors( sqlsrv_errors() ) ); }

           /* Get the first field - the identity from INSERT. */
           $photoID = sqlsrv_get_field($uploadPic, 0);

           /* Associate the new photoID with the productID. */
           $tsql = "UPDATE Production.ProductProductPhoto
                    SET ProductPhotoID = ?
                    WHERE ProductID = ?";

           if( sqlsrv_query($conn, $tsql, array($photoID,
                                  $_REQUEST['productid'])) === false )
           { die( FormatErrors( sqlsrv_errors() ) ); }

           GetPicture( $_REQUEST['productid']);
           DisplayWriteReviewButton( $_REQUEST['productid'] );
           GetSearchTerms (!null);
           sqlsrv_close( $conn );
           break;
   }//End Switch
}
else
{
    GetSearchTerms( !null );
}

function GetPicture( $productID )
{
     echo "<table align='center'><tr align='center'><td>";
     echo "<img src='photo.php?productId=".$productID."'/></td></tr>";
     echo "<tr align='center'><td><a href='?action=displaypicture&
          productid=".$productID."'>Upload new picture.</a></td></tr>";
     echo "</td></tr></table>


"; }

function GetReviews( $conn, $productID )
{
    $tsql = "SELECT ReviewerName, 
                CONVERT(varchar(32), ReviewDate, 107) AS [ReviewDate],
                Rating, 
                Comments 
             FROM Production.ProductReview 
             WHERE ProductID = ? 
             ORDER BY ReviewDate DESC";

    $getReview = sqlsrv_query( $conn, $tsql, array($productID));
    if ( $getReview === false )
    { die( FormatErrors( sqlsrv_errors() ) ); }
    $reviewCount = 0;
    while ( sqlsrv_fetch( $getReview ) )
    {
          $name = sqlsrv_get_field( $getReview, 0 );
          $date = sqlsrv_get_field( $getReview, 1 );
          $rating = sqlsrv_get_field( $getReview, 2 );
          /* Open comments as a stream. */
          $comments = sqlsrv_get_field( $getReview, 3, 
                             SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_CHAR));
          DisplayReview( $productID,
                         $name,
                         $date,
                         $rating,
                         $comments );
          $reviewCount++;
    }
    if( $reviewCount == 0 )
      { DisplayNoReviewsMsg(); }
    DisplayWriteReviewButton( $productID );
    sqlsrv_free_stmt( $getReview );
}

/*** Presentation and Utility Functions ***/

function BeginProductsTable( $tableName, $headings )
{
    /* Display the beginning of the search results table. */
    echo "<table align='center' cellpadding='5'>"; 
    echo "<tr bgcolor='silver'>$tableName</tr><tr>";
    foreach ( $headings as $heading )
    {
        echo "<td>$heading</td>";
    }
    echo "</tr>";
}

function DisplayNoProdutsMsg()
{
    echo "<h4 align='center'>No products found.</h4>";
}

function DisplayNoReviewsMsg()
{
    echo "<h4 align='center'>
             There are no reviews for this product.
          </h4>";
}

function DisplayReview( $productID, $name, $date, $rating, $comments)
{
    /* Display a product review. */
    echo "<table style='WORD-BREAK:BREAK-ALL' width='50%' 
                 align='center' border='1' cellpadding='5'>"; 
    echo "<tr>
            <td>ProductID</td>
            <td>Reviewer</td>
            <td>Date</td>
            <td>Rating</td>
          </tr>";
      echo "<tr>
              <td>$productID</td>
              <td>$name</td>
              <td>$date</td>
              <td>$rating</td>
            </tr>
            <tr>
              <td width='50%' colspan='4'>";
                 fpassthru( $comments );
     echo "</td></tr></table>



"; }

function DisplayUploadPictureForm( $productID, $name )
{
     echo "<h3 align='center'>Upload Picture</h3>";
     echo "<h4 align='center'>$name</h4>";
     echo "<form align='center' action='adventureworks_demo.php'
                    enctype='multipart/form-data' method='POST'>
       <input type='hidden' name='action' value='uploadpicture'/>
       <input type='hidden' name='productid' value='$productID'/>
       <table align='center'>
         <tr>
           <td align='center'>
             <input id='fileName' type='file' name='file'/>
           </td>
         </tr>
         <tr>
           <td align='center'>
            <input type='submit' name='submit' value='Upload Picture'/>
           </td>
         </tr>
       </table>

       </form>";
}

function DisplayWriteReviewButton( $productID )
{
    echo "<table align='center'><form action='adventureworks_demo.php' 
                 enctype='multipart/form-data' method='POST'>
          <input type='hidden' name='action' value='writereview'/>
          <input type='hidden' name='productid' value='$productID'/>
          <input type='submit' name='submit' value='Write a Review'/>
          </p></td></tr></form></table>";
}

function DisplayWriteReviewForm( $productID )
{
    /* Display the form for entering a product review. */
    echo "<h5 align='center'>
              Name, E-mail, and Rating are required fields.
          </h5>";
    echo "<table align='center'>
          <form action='adventureworks_demo.php' 
                enctype='multipart/form-data' method='POST'>
          <input type='hidden' name='action' value='submitreview'/>
          <input type='hidden' name='productid' value='$productID'/>
          <tr>
             <td colspan='5'>
               Name: <input type='text' name='name' size='50'/>
             </td>
          </tr>
          <tr>
             <td colspan='5'>
              E-mail: <input type='text' name='email' size='50'/>
              </td>
          </tr>
          <tr>
            <td>
              Rating: 1<input type='radio' name='rating' value='1'/>
            </td>
            <td>2<input type='radio' name='rating' value='2'/></td>
            <td>3<input type='radio' name='rating' value='3'/></td>
            <td>4<input type='radio' name='rating' value='4'/></td>
            <td>5<input type='radio' name='rating' value='5'/></td>
          </tr>
          <tr>
             <td colspan='5'>
                <textarea rows='20' cols ='50' name='comments'>
               [Write comments here.]
                </textarea>
             </td>
          </tr>
          <tr>
             <td colspan='5'>
                 <p align='center'><input type='submit' name='submit' 
                 value='Submit Review'/>
                 </p>
             </td>
          </tr>
          </form>
          </table>";
}

function EndProductsTable()
{ 
      echo "</table>


"; }

function GetSearchTerms( $success )
{
    /* Get and submit terms for searching the database. */
    if (is_null( $success ))
    {
      echo "<h4 align='center'>Review successfully submitted.</h4>";}
      echo "<h4 align='center'>Enter search terms to find 
products.</h4>";
      echo "<table align='center'>
            <form action='adventureworks_demo.php' 
                  enctype='multipart/form-data' method='POST'>
            <input type='hidden' name='action' 
                   value='getproducts'/>
            <tr>
               <td><input type='text' name='query' size='40'/></td>
            </tr>
            <tr align='center'>
               <td>
                  <input type='submit' name='submit' value='Search'/>
               </td>
            </tr>
            </form>
            </table>";
}

function PopulateProductsTable( $values )
{
    /* Populate Products table with search results. */
    $productID = $values['ProductID'];
    echo "<tr>";
    foreach ( $values as $key => $value )
    {
          if ( 0 == strcasecmp( "Name", $key ) )
          {
             echo "<td>
                   <a href='?action=getreview&productid=$productID'>
                             $value
                   </a>
                   </td>";
          }
          elseif( !is_null( $value ) )
          {
             if ( 0 == strcasecmp( "ListPrice", $key ) )
             {
                /* Format with two digits of precision. */
                $formattedPrice = sprintf("%.2f", $value);
                echo "<td>$$formattedPrice</td>";
              }
              else
              {
                 echo "<td>$value</td>";
              }
           }
           else
           {
              echo "<td>N/A</td>";
           }
    }
    echo "<td>
            <form action='adventureworks_demo.php' 
                  enctype='multipart/form-data' method='POST'>
            <input type='hidden' name='action' value='writereview'/>
            <input type='hidden' name='productid' value='$productID'/>
            <input type='submit' name='submit' 
                   value='Write a Review'/></p>
            </td></tr>
            </form></td></tr>";
}

function RoundPrice( $value )
{
    /* Remove precision (last two zeros) from list price. */
    return substr( $value, 0, -2 );
}

function FormatErrors( $errors )
{
    /* Display errors. */
    echo "Error information: <br/>";

    foreach ( $errors as $error )
    {
          echo "SQLSTATE: ".$error['SQLSTATE']."<br/>";
          echo "Code: ".$error['code']."<br/>";
          echo "Message: ".$error['message']."<br/>";
    }
}
?>
</body>
</html>

photo.php スクリプトでは、指定した ProductID の製品の写真が返されます。このスクリプトは、adventureworks_demo.php スクリプトから呼び出されます。

photo.php という名前のファイルに次のコードを記述してください。

<?php
/*=====================================================================
This file is part of a Microsoft SQL Server Shared Source Application.
Copyright (C) Microsoft Corporation.  All rights reserved.
 
THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
======================================================= */

$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");

/* Connect using Windows Authentication. */
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
     echo "Could not connect.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Get the product picture for a given product ID. */
$tsql = "SELECT LargePhoto 
         FROM Production.ProductPhoto AS p
         JOIN Production.ProductProductPhoto AS q
         ON p.ProductPhotoID = q.ProductPhotoID
         WHERE ProductID = ?";

$params = array($_REQUEST['productId']);

/* Execute the query. */
$stmt = sqlsrv_query($conn, $tsql, $params);
if( $stmt === false )
{
     echo "Error in statement execution.</br>";
     die( print_r( sqlsrv_errors(), true));
}

/* Retrieve the image as a binary stream. */
if ( sqlsrv_fetch( $stmt ) )
{
   $image = sqlsrv_get_field( $stmt, 0, 
                      SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY));
   fpassthru($image);
}
else
{
     echo "Error in retrieving data.</br>";
     die(print_r( sqlsrv_errors(), true));
}

/* Free the statement and connectin resources. */
sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );
?>

参照

概念

データ取得関数の比較

その他のリソース

サーバーへの接続
実行関数の比較
データの取得
データの更新 (SQL Server Driver for PHP)
API リファレンス (SQL Server Driver for PHP)