初歩的な質問で申し訳ありません。
いろいろ調べて、構文チェックなども行ったのですが、行き詰まってます。。。
なんとか自力で調べながらやってきたのですが、いよいよお手上げです。。。
■処理内容
端末からバーコードの値を読み取り、条件のパラメータを付加して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
No.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- …
アドバイスありがとうございます!
多少形は変わりましたが目的としていた処理ができるようになりました。
■目的
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 "エラーカット";
}
No.5
- 回答日時:
うん。
。また、書き込む前に回答増えてたので、書き込むのやめようかと思ったけど、一応。そういや、さっき 自分で「まっしろってのは有り得ない。」とか言っておいて気が付かなかったんだけど、「MySQL接続に失敗しました」とかも表示されないのだとしたら、そこすらも通っていない。
んで、>>4の人の回答になります。以上。
長文の回答ありがとうございます。感謝しております。
ご連絡遅くなってすみませんでした。//昨日は家族サービスでダウンしておりました
みなさんのアドバイスを頂き諸々チューニングしてみました。
結果は>>4の回答にまとめさせて頂きました。
みなさんのおかげで完璧ではありませんが一応の計算結果は出るようになりました。
今度はアプリ側との調整が必要ですが。。。
結果としては
$_GETとして「0」は処理が通らず「1」、「2」、とした場合は加算も減算も処理が通りました。
$state = $_GET['mode']; //登録状態(0=出庫 1=入庫 2=手動出庫 3=手動入庫 9=削除)
不完全ではありますが、1=入庫、2=手動出庫、3手動出庫 を利用して可能かどうか
アプリ側の検証に入ってみます。
結果としは納得はしてないので、今後も検証はしてみます。
No.4
- 回答日時:
> 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の場合の検証はまだ出来てませんので、改めて報告したいと思います
No.3
- 回答日時:
結構、長い文章書いたあとに、書き込む前にリロードしたら、新たな情報が追加されてたので、書きなおした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が非推奨になった事に俺が衝撃を受けた理由は「今まで書いたの置き換えが必要なの?めんどくさ~」って事、一点です。
No.2
- 回答日時:
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:」の記述に問題があるのではないでしょうか。
という所まできました。
No.1
- 回答日時:
内容ちゃんと見てないので、
ズバリ解決ではなくデバッグ方法。
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歩原因に近づきました。
まだ解決はしていませんが。
また気になるところがありましたら、ご教授ください
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Visual Basic(VBA) VBAでのループ順序について 3 2023/03/13 10:55
- MySQL mysqlがインストールされているのかどうか 1 2023/06/05 14:19
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(プログラミング・Web制作) Windowsのバッチファイルについてご教示ください 5 2023/07/25 20:23
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPで絞り込み検索結果の件数を...
-
PHPで同じDBから違う内容でカウ...
-
「mysqlclient」の事が分からな...
-
mysql_fetch_objectのエラー
-
会員登録したらメールが送られ...
-
インクルードによる不具合
-
<select> の<option value>が指...
-
mariadbでのエラー
-
stringaddslashes 半角¥が消える
-
【PHP】クエリーの実行に失敗し...
-
PHP+MySQLの構造
-
テーブルに入っているデータと...
-
mysql_num_rowsなどのWarningの...
-
クエリ検索でのWHERE句 HAVING...
-
var_dumpの使い方について
-
すいません。
-
if文で、レコードが無い場合だ...
-
sprintf関数での%Sが分かりませ...
-
mysql/rubyのインストールが出...
-
PHPからMySQLの起動について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブルに入っているデータと...
-
sqlから多次元配列に要素を格納...
-
SQL文2つ実行
-
phpのエラーについてです
-
stringaddslashes 半角¥が消える
-
mysql_fetch_objectのエラー
-
XAMPPで画面が真っ白になります。
-
XAMMPが起動しません。
-
縦に長い<table>でなく横に長い...
-
PHP+mysqlでSQL文に文字数制限...
-
会員登録したらメールが送られ...
-
Resource id #3 をフィールドの...
-
MySQLのデータを使ってプルダウ...
-
PHPで絞り込み検索結果の件数を...
-
MySQLのUPDATE実行結果を受け取...
-
mysql_query等でレコード数を変...
-
住所録を作りたい
-
DB(MySQL)から複数行のデータを...
-
CSVをダウンロードさせた際、CS...
-
SQLの結果が返ってこない
おすすめ情報