dポイントプレゼントキャンペーン実施中!

初歩的な質問で申し訳ありません。

いろいろ調べて、構文チェックなども行ったのですが、行き詰まってます。。。
なんとか自力で調べながらやってきたのですが、いよいよお手上げです。。。

■処理内容
端末からバーコードの値を読み取り、条件のパラメータを付加してURLで送り
カラム内のstock数をupdateする処理です。
 ・パラメーターのmodeの値を読み取って「0」の出庫ならば減算、
  「1」の入庫ならば加算で合計の値をupdateします。

■現状と解決したい点
switch($state) case 0:が計算されません
switch($state) case 1:は計算結果がカラムに格納されます。


■端末アプリから吐出されるパラメーター(アプリ名:istocker)
http://デモサイト/stock-regist-istocker.php?base_id=2&group_id=1&mode=0&password=&date=2011-02-22%2005:32:00&key=100&barcode=nabe-01
(必要な項目はmodeとkeyとbarcodeの3項目のみです。上記パラメータは
端末アプリ依存の物なので変更はできません)

・mode://登録状態(0=出庫 1=入庫 2=手動出庫 3=手動入庫 9=削除)
・key://入荷数
・barcode://登録された商品番号

■環境
CentOS 6.2
MySQL 5.1.67
PHP 5.3.3

■補足
なんでこのような処理を。。。と思われるかと思いますが、上述のように
パラメーターが端末アプリ依存のため「ー(マイナス)」の値を吐出せないので(泣
下記ソースと同じ内容でブラウザ入力用のphpも用意したのですが、そちらでは
「ー(マイナス)」の値で無事に加算・減算ができました。


■ソース
<?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=削除)


$mysql_con = mysql_connect("localhost","DBUSER","PASSWORD");
if($mysql_con == false){
print ('MySQL接続に失敗しました<br>');
}else{
print ('接続完了しました<br>');
}

if(mysql_select_db("DBNAME",$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 "エラーカット";
}

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."'"); //在庫数を商品番号で指定して更新する

break;

case 1:
$zaiko = mysql_fetch_array($mytbl);
$kei=$zaiko[0] + $quant; //現状の在庫から在庫を加算する
$mytbl = mysql_query("UPDATE dtb_products_class set stock='".$kei."' where product_code='".$no."'"); //在庫数を商品番号で指定して更新する
break;

}

$comp_flg = 0;
if(!$mytbl){
die(mysql_error()); //エラーの場合はカットする
print "エラーカット";
}
}
?>



何卒、お力、ヒントなどよろしくお願いします m(__)m

A 回答 (6件)

マニュアル読んでください。



boolean への変換
http://www.php.net/manual/ja/language.types.bool …

ついでに
いきなり $_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- …

この回答への補足

後学のためにもご指摘頂いたソースは勉強しておきます^^;

補足日時:2013/04/30 10:06
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます!

多少形は変わりましたが目的としていた処理ができるようになりました。

■目的
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 "エラーカット";
}

お礼日時:2013/04/30 10:05

うん。

。また、書き込む前に回答増えてたので、書き込むのやめようかと思ったけど、一応。

そういや、さっき 自分で「まっしろってのは有り得ない。」とか言っておいて気が付かなかったんだけど、「MySQL接続に失敗しました」とかも表示されないのだとしたら、そこすらも通っていない。

んで、>>4の人の回答になります。以上。
    • good
    • 0
この回答へのお礼

長文の回答ありがとうございます。感謝しております。
ご連絡遅くなってすみませんでした。//昨日は家族サービスでダウンしておりました

みなさんのアドバイスを頂き諸々チューニングしてみました。

結果は>>4の回答にまとめさせて頂きました。

みなさんのおかげで完璧ではありませんが一応の計算結果は出るようになりました。

今度はアプリ側との調整が必要ですが。。。


結果としては
$_GETとして「0」は処理が通らず「1」、「2」、とした場合は加算も減算も処理が通りました。

$state = $_GET['mode']; //登録状態(0=出庫 1=入庫 2=手動出庫 3=手動入庫 9=削除)

不完全ではありますが、1=入庫、2=手動出庫、3手動出庫 を利用して可能かどうか
アプリ側の検証に入ってみます。

結果としは納得はしてないので、今後も検証はしてみます。

お礼日時:2013/04/28 10:47

> if($_GET[barcode] && $_GET[key] && $_GET[mode]){


if ("0") は true にならない。
isset() を使とか ctype とかで。

ついでに
$_GET[mode]は $_GET['mode']と書きましょう。(マニュアル参照

case はあいまいな比較なので注意。
$_GETなら文字列なので if ($state === "0") と書けばよい。
    • good
    • 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の場合の検証はまだ出来てませんので、改めて報告したいと思います

お礼日時:2013/04/28 11:01

結構、長い文章書いたあとに、書き込む前にリロードしたら、新たな情報が追加されてたので、書きなおした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. …

他の質問の話だけど、俺の回答にレスがついてたのでココで言わせてもらうと、mysql_queryが非推奨になった事に俺が衝撃を受けた理由は「今まで書いたの置き換えが必要なの?めんどくさ~」って事、一点です。
    • good
    • 0

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文にすると思いますが・・・
    • good
    • 0
この回答へのお礼

ありがとうございます。

まだ解決はしていませんが、アドバイスにより原因に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:」の記述に問題があるのではないでしょうか。
という所まできました。

お礼日時:2013/04/26 23:56

内容ちゃんと見てないので、


ズバリ解決ではなくデバッグ方法。

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できるか確認。
    • good
    • 0
この回答へのお礼

ありがとうございます。

デバッグの結果はupdateもechoの結果も処理が完了せず、出来ていませんでした
画面がまっしろの状態です。

ただ。NO.2さんの方のお礼にも書いておきますが、1歩原因に近づきました。
まだ解決はしていませんが。

また気になるところがありましたら、ご教授ください

お礼日時:2013/04/26 23:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!