- ベストアンサー
PHPでバーコードの値を読み取って在庫数を更新する処理について
- 初歩的な質問で申し訳ありません。PHPでバーコードの値を読み取って在庫数を更新する処理を行いたいのですが、変数同士の引き算ができない問題に直面しています。
- 処理の内容は、端末からバーコードの値を読み取り、条件のパラメータを付加してURLで送り、カラム内のstock数をupdateするものです。modeの値によって出庫か入庫かを判断し、在庫数を減算または加算します。
- 現状では、modeが1の場合は計算結果がカラムに格納されますが、modeが0の場合には引き算が計算されません。ソースコードを確認しましたが、原因がわかりません。どなたか解決策をご教示いただけますと助かります。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
マニュアル読んでください。 boolean への変換 http://www.php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting ついでに いきなり $_GET['name'] で検証すると入力がないとき警告が発生しているので ふつうは isset() で検証します。 $state = isset($_GET['mode']) ? $_GET['mode'] : null; あと私は {} の入れ子が多いと読みにくいので意図しない処理を先に除外します。 if (!$conn = mysql_connect()) { exit;// or return } // 成功時の処理 さらについでにこういうのも読んでおいたほうがいいでしょう。 http://framework.zend.com/manual/1.12/ja/coding-standard.coding-style.html
その他の回答 (5)
- bm_hiro
- ベストアンサー率51% (200/388)
うん。。また、書き込む前に回答増えてたので、書き込むのやめようかと思ったけど、一応。 そういや、さっき 自分で「まっしろってのは有り得ない。」とか言っておいて気が付かなかったんだけど、「MySQL接続に失敗しました」とかも表示されないのだとしたら、そこすらも通っていない。 んで、>>4の人の回答になります。以上。
お礼
長文の回答ありがとうございます。感謝しております。 ご連絡遅くなってすみませんでした。//昨日は家族サービスでダウンしておりました みなさんのアドバイスを頂き諸々チューニングしてみました。 結果は>>4の回答にまとめさせて頂きました。 みなさんのおかげで完璧ではありませんが一応の計算結果は出るようになりました。 今度はアプリ側との調整が必要ですが。。。 結果としては $_GETとして「0」は処理が通らず「1」、「2」、とした場合は加算も減算も処理が通りました。 $state = $_GET['mode']; //登録状態(0=出庫 1=入庫 2=手動出庫 3=手動入庫 9=削除) 不完全ではありますが、1=入庫、2=手動出庫、3手動出庫 を利用して可能かどうか アプリ側の検証に入ってみます。 結果としは納得はしてないので、今後も検証はしてみます。
- tany180sx
- ベストアンサー率63% (239/379)
> if($_GET[barcode] && $_GET[key] && $_GET[mode]){ if ("0") は true にならない。 isset() を使とか ctype とかで。 ついでに $_GET[mode]は $_GET['mode']と書きましょう。(マニュアル参照 case はあいまいな比較なので注意。 $_GETなら文字列なので if ($state === "0") と書けばよい。
お礼
ご相談頂きありがとうございます。 みなさんのアドバイスを元に諸々チューニングしてみました。 結果としてはいずれの式の場合でも$_GETの値が「0」の場合だけ処理が通らないのでした。 下記の式を使用して$_GETの値を「1」入庫、「2」手動出庫として処理してみたところ 何の問題も無く処理が終了しております。 if($state === "1"){ $mytbl = mysql_query("UPDATE dtb_products_class set stock=stock+". $quant . " where product_code='".$no."'"); }elseif($state === "2"){ $mytbl = mysql_query("UPDATE dtb_products_class set stock=stock-". $quant . " where product_code='".$no."'"); } 参考までに以下の式にて検証してみたところ、「0」の場合だけ処理が終了してませんでした。 <?php $comp_flg = 1; if($_GET['barcode'] && $_GET['key'] && $_GET['mode']){ //データが全て入力されている場合 $no = $_GET['barcode']; //登録された商品番号 $quant = $_GET['key']; //入荷数 $state = $_GET['mode']; //登録状態(0=出庫 1=入庫 2=手動出庫 3=手動入庫 9=削除) print($quant); //$quantを検証 print("<br/>"); print($state); //$stateを検証 print("<br/>"); $mysql_con = mysql_connect("localhost","demo-eccube","fxh5uyu7"); if($mysql_con == false){ print ('MySQL接続に失敗しました<br>'); }else{ print ('接続完了しました<br>'); } if(mysql_select_db("demo-eccube-db",$mysql_con)){ //sample01のデータベースに接続し、接続の確認 print "データベースに接続しました<br>"; }else{ die("接続に失敗しました<br>"); //接続に失敗したときにMySQLの接続を切る } $mytbl = mysql_query("select stock from dtb_products_class where product_code='".$no."'",$mysql_con); //現状の在庫データーを呼び出すクエリー if(!$mytbl){ die(mysql_error()); //エラーの場合はカットする print "エラーカット"; } if($state === "1"){ $mytbl = mysql_query("UPDATE dtb_products_class set stock=stock+". $quant . " where product_code='".$no."'"); //在庫数を商品番号で指定して更新する }elseif($state === "2"){ $mytbl = mysql_query("UPDATE dtb_products_class set stock=stock-". $quant . " where product_code='".$no."'"); //在庫数を商品番号で指定して更新する } $comp_flg = 0; if(!$mytbl){ die(mysql_error()); //エラーの場合はカットする print "エラーカット"; } } ?> 「1」の場合の処理結果の表示は(key=1000、mode=1の場合) 1000 1 接続完了しました データベースに接続しました 「0」の場合は処理が完了してないので表示は何もでませんでした。 issetの場合の検証はまだ出来てませんので、改めて報告したいと思います
- bm_hiro
- ベストアンサー率51% (200/388)
結構、長い文章書いたあとに、書き込む前にリロードしたら、新たな情報が追加されてたので、書きなおしたZE。。。 > 画面がまっしろの状態です。 うん。その結果から明白なことが一つ。 「case 0を通っていない。」 case 0 を通っているなら、最低でも $mytblの中身が表示されるはずであり、まっしろってのは有り得ない。 case "0": ← にしてみるとどうでしょ? - - - - - - - - - 以下、戯言。 好みの問題だとは思いますが、いろいろ無駄な書き方してるなーと思います。 最近は、三項演算子が流行りらしいので、↓は > if($mysql_con == false){ > print ('MySQL接続に失敗しました<br>'); > }else{ > print ('接続完了しました<br>'); > } ↓ みたいに書くかな。 print ($mysql_con == false) ? 'MySQL接続に失敗しました<br>' : '接続完了しました<br>'; switch($state){~}の部分も、似たようなこと2回書いてるので、俺なら 数式だけ 変数に入れる。 ↓みたいに。 switch($state){ case 0: $addorsub = "-"; break case 1: $addorsub = "+"; break; } $mytbl = mysql_query("UPDATE dtb_products_class set stock=stock" . $addorsub . $quant . " where product_code={$no}"); $state は 0,1以外にもあるようだから そのまま switch 使ったけど、二つだけなら コレもswitchじゃなく三項演算子でいける。 それと、agunuzさんも言ってますが、SQL文の中の数値型にはシングルクォートはなくても良かった気が。stockって もしかして varcharとかの文字型? だとしたら、きっと ↑の書き方は使えない。 PHPは アバウトだから 文字列型でも、中身が数字だと ちゃんと計算してくれたりしてくれますが、mysqlは そんなに融通聞かなかったと思う。 あと、一応言っておくと PHP5.5以降は mysql~ じゃなくて mysqli~を使ってね。ってのが世の中の流れらしいですよ。 http://php.net/manual/ja/function.mysql-connect.php 他の質問の話だけど、俺の回答にレスがついてたのでココで言わせてもらうと、mysql_queryが非推奨になった事に俺が衝撃を受けた理由は「今まで書いたの置き換えが必要なの?めんどくさ~」って事、一点です。
- agunuz
- ベストアンサー率65% (288/438)
stockにセットする値を単引用符で括っているのは何故でしょうか?また普通は switch($state){ case 0: $mytbl = mysql_query("UPDATE dtb_products_class set stock=stock-" . $quant . " where product_code='".$no."'"); break; case 1: $mytbl = mysql_query("UPDATE dtb_products_class set stock=stock+". $quant . " where product_code='".$no."'"); break; } のようなSQL文にすると思いますが・・・
お礼
ありがとうございます。 まだ解決はしていませんが、アドバイスにより原因に1歩近づけました。 アドバイス頂いた構文でチェックを繰り返してみましたが、以下のような結果になりました。 ■以下の書式でチェック case 1: $mytbl = mysql_query("UPDATE dtb_products_class set stock=stock-". $quant . " where product_code='".$no."'"); ・stock+".$quant." or stock-".$quant." いずれも正しい計算結果がカラムに格納される case 0: $mytbl = mysql_query("UPDATE dtb_products_class set stock=stock-". $quant . " where product_code='".$no."'"); ・stock+".$quant." or stock-".$quant." いずれも計算できない という事は「case 0:」の記述に問題があるのではないでしょうか。 という所まできました。
- Gaffgarion
- ベストアンサー率45% (45/99)
内容ちゃんと見てないので、 ズバリ解決ではなくデバッグ方法。 switch($state){ case 0: $zaiko = mysql_fetch_array($mytbl); $kei=$zaiko[0] - $quant; //現状の在庫に新たな在庫を減算する //$mytbl = mysql_query("UPDATE dtb_products_class set stock='".$kei."' where product_code='".$no."'"); //在庫数を商品番号で指定して更新する $mytbl = "UPDATE dtb_products_class set stock='".$kei."' where product_code='".$no ."';"; echo $mytbl; break; として、update以外が上手くいってるか確認 上手くいってるならechoした$mytblをmysqlコマンドラインで手入力してupdateできるか確認。
お礼
ありがとうございます。 デバッグの結果はupdateもechoの結果も処理が完了せず、出来ていませんでした 画面がまっしろの状態です。 ただ。NO.2さんの方のお礼にも書いておきますが、1歩原因に近づきました。 まだ解決はしていませんが。 また気になるところがありましたら、ご教授ください
お礼
アドバイスありがとうございます! 多少形は変わりましたが目的としていた処理ができるようになりました。 ■目的 iphone、タブレット端末のバーコードからJANを読み込み在庫登録、更新をする ■最終的に決まった処理の仕方 当初のistockerアプリは仕様の問題で在庫数をうまくGETできなかったので やめて以下のアプリを使いました。 http://www.pic2shop.com PHPで<a href="pic2shop://scan?callback=httpsエンコード部分fEAN">バーコードで登録 </a> からアプリを呼び出しEAN部分でパラメーターの付加 window.location.searchで取得パラメーターをINPUTテキストエリアに表示 在庫数は画面上からキーボード入力で対応する事で直接+(プラス)、ー(マイナス)と して計算する これが出来たことで以前の業務よりも格段にシンプルに、作業時間も大幅な短縮につながりました。 自分で構築したことによる副産物としてブラウザからの在庫管理も簡略化する事ができました。 みなさんにBAを付けたいほど感謝しております。 ありがとうございました! ■結局、問題になっていたphpソース部分は現在以下のソースになってます(汗 $mytbl = mysql_query("select stock from dtb_products_class where product_code='".$no."'",$mysql_con); //現状の在庫データーを呼び出すクエリー if(!$mytbl){ die(mysql_error()); //エラーの場合はカットする print "エラーカット"; } $zaiko = mysql_fetch_array($mytbl); $kei=$quant+$zaiko[0]; //現状の在庫に新たな在庫を加算する $mytbl = mysql_query("UPDATE dtb_products_class set stock='".$kei."' where product_code='".$no."'"); //在庫数と、入荷日を商品番号で指定して更新する $comp_flg = 0; if(!$mytbl){ die(mysql_error()); //エラーの場合はカットする print "エラーカット"; }
補足
後学のためにもご指摘頂いたソースは勉強しておきます^^;