//tips
//php理解
カートに表示する数量を変更するkazu_change.phpのスクリプトを見直す。
var_dump($max);が1なのでこの数字が$kazuの中に入るはず。
Foreach内の中身を再度検証していく。
まずPHPでデータベースに接続するために$dbh=new PDO($dsn,$user,$password);を使用し、その引数に必要なデータベース情報$dsn='mysql:dbname=shop;host=localhost;charset=utf8’;などを定義している。
PDO::ATTR_ERRMODEのPDO::ERRMODE_EXCEPTION を設定すると例外を表示してくれる。setAttributeで接続後のオプションとして設定。
$dsn='mysql:dbname=shop;host=localhost;charset=utf8';
$user='root';
$password='';
$dbh=new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$sql='SELECT code,name,price,gazou FROM mst_product WHERE code=?’;ではmst_product テーブルにあるcode,name,price,gazouデータを、特定の値を検索して一致したものだけを取得するwhereの条件のもと取得する。
?の部分には入力欄で記入された条件が入ることになるが、その前にPrepareメソッドの中にsql文を埋め込むことでsqlの実行準備を行っている。
$stmtにsq操作lが実行できるPDOstatementインスタンスが作成される。
そのインスタンスに対して、execute(値)でexecuteメソッドの引数に?部分を入れる。この際に引数の値は配列として渡される。複数の?と設置することがあるので、その場合は?の並びの順番に配列内の数字が代入される。
foreach($cart as $key=>$val){
$sql='SELECT code,name,price,gazou FROM mst_product WHERE code=?';
$stmt=$dbh->prepare($sql);
$data[0]=$val;
$stmt->execute($data);
Sqlスクリプトをexecuteで実行した結果はPDOStatementクラスのfetchメソッドで取得することができる。
フェッチモードとは、PDOでデータベースからデータを取り出した際の「配列の形式を指定するモード」のことで様々な種類がある。
https://blog.senseshare.jp/fetch-mode.html
今回はFETCH_ASSOC:【配列のキー】カラム名のみを取得している。
$rec=$stmt->fetch(PDO::FETCH_ASSOC);
$pro_name[]=$rec['name'];
$pro_price[]=$rec['price'];
var_dump($rec);とすると、下記が取得できた。
array(4) { ["code"]=> string(1) "1" ["name"]=> string(12) "にんじん" ["price"]=> string(3) "100" ["gazou"]=> NULL }
もう少し良くみてみると接続切断の$dbh=null;がforeach内に組み込まれていたので修正。foreachの外に出した。
ただ、ここはkazuの中身には影響しなかった。
$kazu=$_SESSION['kazu’];の由来となるのは、入力内容を受け取る$post=sanitize($_POST);以下の部分。
$post=sanitize($_POST);
$max=$post['max'];
for($i=0,$i<$max;$i++;){
$kazu[]=$post['kazu'.$i];
}
$_SESSION['kazu']=$kazu;
header('Location:shop_cartlook.php');
exit();
一旦header部分をコメントアウトして遷移させないようにし、ログを表示させる。
$post=sanitize($_POST);
var_dump($post);
とするとarray(2) { ["kazu0"]=> string(1) "1" ["max"]=> string(1) "1" }となり、
<input type="text" name="kazu<?php print $i;?>" value="<?php print $kazu[$i];?>">
<input type="hidden" name="max" value="<?php print $max;?>">
for($i=0;$i<$max;$i++){の;の記載ミスが確認できたので修正。
これで無事に問題を解決できた。,や.などのミスにも注意する。
次はカートから商品を削除する。
まずはチェックボックスを追加。
<input type = "checkbox" name="sakujo<?php print $i;?>”>、
配列の削除の方法はarray_spliceメソッドを使用し、
array_splice($変数名,何番目を削除するか,幾つ削除するか);
という引数を記入していく。
ただ、こうすると前から順番がずれていってしまうので後ろから削除して本来の順番を変えないようにする。
逆にカウントするのはfor($i=99;0<=$i;$i-)としてループごとに一つずつ値を減らすようにすれば良い。
<?php
session_start();
session_regenerate_id(true);
require_once('../common/common.php');
$post=sanitize($_POST);
var_dump($post);
$max=$post['max'];
var_dump($max);
for($i=0;$i<$max;$i++){
$kazu[]=$post['kazu'.$i];
}
$cart=$_SESSION['cart'];
for($i=$max;0<=$i;$i--){
if(isset($_POST['sakujo'.$i])==true){
array_splice($cart,$i,1);
array_splice($kazu,$i,1);
}
}
$_SESSION['cart']=$cart;
$_SESSION['kazu']=$kazu;
header('Location:shop_cartlook.php');
exit();
?>
これでチェックしたアイテムを数量変更ボタンを押すことで削除できるようになった。