

カレンダー予約システムで、セッションに入ってる予約数を、在庫管理に組み込みたいのですがうまくいきません。  
こちらの良いやり方があればアドバイスいただきたいです。

【できているところ】  
データベースから商品番号を参照して、予約データの予約が入っている日の予約数を、在庫数$maxに参照して在庫の有る無しを判定

在庫を調べるためのデータ  
$room_id 商品ID  
$reservday 日時  
$max 在庫総数 ※ $max < $m で在庫無し

1.予約データを取り出して、予約数を数える

[code]

    $m =0;
    mysql_select_db($DBNAME, $connect);
    mysql_query("SET NAMES utf8");
    $query = "SELECT * FROM reserve_table WHERE type='$room_id' AND reserve_day='$reservday'";
    $result = mysql_query($query) or die(mysql_error());
        while ($row = mysql_fetch_array($result)) {
            $m++;
        }
    
[/code]

2.セッション$_SESSION[item]の中身

[code]

    Array ( 
    // [key]1商品×日程ごとの固有KEY [reserve_day]予約開始日 [renpaku]連泊数
    [0] => Array ( [key] => 1458583223 [type] => 5 [reserve_day] => 20160322 [renpaku] => 1 ) 
    [1] => Array ( [key] => 1458583836 [type] => 5 [reserve_day] => 20160327 [renpaku] => 1 ) 
    [2] => Array ( [key] => 1458584148 [type] => 1 [reserve_day] => 20160321 [renpaku] => 1 ) 
    )
    
[/code]

【やりたいこと】  
１の$mに、セッション変数に入っている$mを予約数にプラスしたい。  
下の書き方では正常な動作になりませんでした。こちらをどのように修正すればいいかアドバイスをいただけるとありがたいです。

3.セッションの予約数をデータベースの予約数にプラスする

[code]

    foreach ($_SESSION['item'] as $od => $val) {
    $type = $val[ room_id ];
    $reserve_day = $val[ reserve_Day ];
    $renpaku = $val[ renpaku ]; //連泊日数
    $ren = 0;
    
    if($type == $row[type]) {
    
      //連日予約用にreserve_dayを分断、月またぎの予約に対応
      $year = substr($reserve_day, 0, 4);
      $mon = substr($reserve_day, 4, 2);
      $day = substr($reserve_day, 6, 2);
    
      //連日予約の、全ての日が予約数に追加されるようにする
      for ($i = 1; $i <= $renpaku; $i++) {
        if ($renpaku >= 2) {
          $tomorrow = mktime(0, 0, 0, $mon, $day + $ren, $year);
          $reserve_day = date(Ymd, $tomorrow);
        }
        $ren++;
      }
      $m++; //ここが合っていない？
    }
    
[/code]


CC BY-SA 3.0
2016-03-22T13:00:46.303
23351
2016-03-23T02:03:51.667
2016-03-22T14:15:18.707
13755
13755
question
php session
宿泊予約で、セッションに入ってる予約数を在庫管理に組込みたい


明らかな間違いや良くないところが多数あり、基本的な部分から勉強された方が良いように思います。

  * `mysql_*`系の関数は古すぎて非推奨です
  * `SET NAMES utf-8`で文字エンコーディングを指定してはいけません
  * SQLに変数が直接埋め込まれており、事前にエスケープしていない場合はSQLインジェクションが可能になります。プレースホルダを使いましょう。(勧められませんが)エスケープする場合は漏れを防ぐため組み立てと同時やるのがセオリーです。
  * コメントでも指摘があるとおり、行数が必要なら取得した結果をループで回すのではなく`COUNT`を使いましょう。
  * 連想配列のキーが`'`や`"`で括られておらず文字列リテラルになっていませんがいいんでしたっけ？
  * 連想配列から`room_id`をキーとする値を取得しようとしていますが、提示されたデータには含まれていません。(`type`の誤り?)
  * 同様に`reserve_Day`も。(`reserve_day`の誤り?)
  * 「連日予約」を処理しているループは、`$renpaku`の値を加算するだけでよいので不要

宿泊予約ということですが、トランザクションを適切に扱わないとダブルブッキングのようなことがおきます(参考:[嵐のコンサートがあるとダブルブッキングしてしまうホテル予約システムを作ってみた
| 徳丸浩の日記](http://blog.tokumaru.org/2015/05/blog-post.html)。

webアプリケーションは注意しないと簡単にセキュリティホールを作り込んでしまいます。少なくともIPAの[安全なwebサイトの作り方](http://www.ipa.go.jp/security/vuln/websecurity.html)は読んだ方がよいでしょう。「体系的に学ぶ
安全なWebアプリケーションの作り方」(ISBN 4797361190)など信頼できる書籍で勉強されることをお勧めします。

PHPそのものの入門書についてはおすすめ出来るものを知りません(読んだことないので)が、"[「いちばんやさしいPHPの教本」のレビューを担当しました |
徳丸浩の日記](http://blog.tokumaru.org/2015/05/php_8.html)"の書評は参考になると思います。


CC BY-SA 3.0
2016-03-23T00:40:02.760
23360
2016-03-23T02:03:51.667
2016-03-23T02:03:51.667
5793
5793
23351
answer