質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
dBASE

dBASEは、Ashton Tate社が開発したデータベース管理システム (DBMS) です。初期のマイクロコンピュータ向けに開発。広く使用されていました。現在は、RAD環境を取り入れたVisual dBASEとして、米dBASE社が提供しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2134閲覧

[PHP]SQL文 WHEREの変数がNULLになる

songpu

総合スコア6

dBASE

dBASEは、Ashton Tate社が開発したデータベース管理システム (DBMS) です。初期のマイクロコンピュータ向けに開発。広く使用されていました。現在は、RAD環境を取り入れたVisual dBASEとして、米dBASE社が提供しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/03/17 09:31

前提・実現したいこと

[PHP]ECサイトのカート機能を作っていて、データベースからSQLで WHERE に変数(商品のコードナンバー)を入れて検索し、該当の項目を取り出したい。

発生している問題・エラーメッセージ

商品ページでカートに入れるを押した時に、商品それぞれのコードナンバーはPOST送信されているのですが、
カートページにいくと値がNULLとなってしまい、WHEREに変数を代入できません。
(これが変数を取得できない原因だと考えていますが、違う原因であれば、ご教授をお願いしたいです。)
(作成途中なもので、申し訳ないですが、データベース 接続の後に該当のsqlを記載しています。)

商品ページのソースコード[PHP]

<?php session_start(); if($_SERVER['REQUEST_METHOD'] === 'POST'){ $product = $_POST['product']; $num = $_POST['num']; $codeno = $_POST['codeno']; $_SESSION['cart'][$product][$codeno] = $num; } $cart = array(); if(isset($_SESSION['cart'])){ $cart = $_SESSION['cart']; } var_dump($codeno); ?> <html> <head> <meta charset="utf-8"> <title>sample</title> </head> <body> <a href="cart.php">カートを見る</a> <form action="" method="post"> <p> Sサイズ / 在庫有り</p> <select name="num" value="3130c1s9set"> <?php for($i = 1; $i < 10; $i++):?> <option value="<?php echo $i;?>"><?php echo $i;?></option> <?php endfor; ?> </select> <input type="hidden" name="product" value="3130c1s9set"> <?php if(isset($cart['3130c1s9set']) === TRUE):?> <p>カートに入っています。</p> <?php else: ?> <input type="hidden" name="codeno" value="3130c1s9set"> <input type="submit" class="cartbtn" value="Sサイズをカートに入れる"> <?php endif;?> </form> </body> </html>

カートのソースコード[PHP]

PHP

<?php session_start(); $cart = array(); if($_SERVER['REQUEST_METHOD'] === 'POST'){ $product = $_POST['product']; $kind = $_POST['kind']; if($kind === 'change'){ $num = $_POST['num']; $_SESSION['cart'][$product][$codeno] = $num; }elseif($kind === 'delete'){ unset($_SESSION['cart'][$product][$codeno]); } } if(isset($_SESSION['cart'])){ $cart = $_SESSION['cart']; } var_dump($codeno); ?> <html> <body> <p><a href="sample.php">商品一覧へ</a></p> <p><a href="delete.php">カートをすべて空に</a></p> <table style="text-align:center"> <tr> <th>商品名</th> <th>1</th> <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>変更ボタン</th> <th>削除ボタン</th> <th>6</th> </tr> <?php foreach($cart as $key => $var):?> <tr> <td> <?php require('dcon.php'); ?> </td> <td> <?php require('dcon.php'); ?> </td> <td> <?php require('dcon.php'); ?> </td> <td> <?php require('dcon.php'); ?> </td> <td><?php echo $var?>個</td> <form action="" method="post"> <td> <select name="num"> <?php for($i = 1; $i <10; $i++):?> <option value="<?php echo $i;?>"><?php echo $i;?></option> <?php endfor; ?> </select> </td> <td> <input type="hidden" name="kind" value="change"> <input type="hidden" name="product" value="<?php echo $key?>"> <input type="submit" value="変更"> </td> </form> <form action="" method="post"> <td> <input type="hidden" name="kind" value="delete"> <input type="hidden" name="product" value="<?php echo $key?>"> <input type="submit" value="削除"> </td> <td> <?php require('dcon.php'); ?> </td> </form> </tr> <?php endforeach; ?> </table> </body> </html>

データベース接続のソースコード

//DBへの接続準備 $dsn = 'mysql:dbname=mcraft;host=localhost;charset=utf8'; $user = 'root'; $password = 'root'; $options = array( // SQL実行失敗時に例外をスロー PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // デフォルトフェッチモードを連想配列形式に設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) // SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, ); try{ // PDOオブジェクト生成(DBへ接続) $dbh = new PDO($dsn, $user, $password, $options); $dbh->query("set names utf8"); }catch (PDOException $e){ echo 'データベースにアクセスできません!' . $e->getMessage(); } echo '接続成功1'; try{** // SELECT文を変数に格納この部分のWHEREに変数を代入することができません。** $sql = "SELECT name FROM craft WHERE code="$codeno""; // SQLステートメントを実行し、結果を変数に格納 $stmt = $dbh->query($sql); var_dump($sql); // foreach文で配列の中身を一行ずつ出力 foreach ($stmt as $row) { // 出力 echo $row['name']; } echo '接続成功2<br>'; }catch (PDOException $e) { die('DB接続エラー'. $e->getMessage()); } // 接続の解除 $connect = null; echo 'DB切断成功<br>'; ?> コード

試したこと

WHERE のあとのシングルクォーテーション、ダブルクォーテーションは色々試しましたが、
それが問題というより、おそらく、変数が渡せてないことが原因かと思い、
var_dumpで中身をみましたが、NULLになる原因が分からず、質問させていただきました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/03/17 09:51

学習書を変えた方が良いですよ。 全体的に使い物にならないコードです。
guest

回答2

0

ベストアンサー

流れ的にはこんなかんじ

PHP

1<?PHP 2$codeno=filter_input(INPUT_POST,"codeno"); 3$datas=[]; 4$sql = "SELECT name FROM craft WHERE 1 "; 5if(!empty($codeno)){ 6 $sql.="and code=? "; 7 $datas[]=$codeno; 8} 9print $sql.";<br>"; 10print_r($datas); 11?> 12<form method="post"> 13<input name="codeno" value="123"> 14<input type="submit" value="send"> 15</form>

hiddenでコード渡すのはいまいちですね
予めコードは選択された状態なのであればセッションで渡してください

投稿2021/03/18 03:27

yambejp

総合スコア114814

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

songpu

2021/03/18 07:05

ご回答をいただきまして、ありがとうございます。 実際解決には至っていないのですが、hiddenでコードを渡すなどご指摘いただいた部分を考慮して作成しなおしたいと考えております。 また私の質問が目に止まった時は、アドバイスいただければありがたいです。 ありがとうございました。
guest

0

下記コードの部分を下のように変えてみてください※SQLを"で閉じた後に.で繋げる。

php

1//$sql = "SELECT name FROM craft WHERE code="$codeno""; 2$sql = "SELECT name FROM craft WHERE code=".$codeno;

PHPの変数を展開する場合は確か文字列の外に出して結合させてあげる必要があったはずです。

※te2ji様よりご指摘いただいたため追記です。

他にも書き方はあるのですが、一度に出しても混ざるかなと思い、
「必要」という強い言葉を使いました。

「このケースであれば、下のコードに変えると動きますよー」
くらいのふわっとした表現でとどめておくべきだったかなぁと。

「まだ勉強したりないぜっ」というガッツがおありのようでしたら、
te2ji様がご提示くださったコメント欄のURLをチェックされることをおすすめいたします。

以下蛇足です。
僕はあまりPHPで{変数}という書き方をしないです。
javascriptのFWで{}を見てからPHPでは使わないようにしようと決めております。
まぁ完全に使いこなせているわけではないので、わぉんですが。

投稿2021/03/17 09:40

編集2021/03/17 10:44
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/03/17 09:54

> PHPの変数を展開する場合は確か文字列の外に出して結合させてあげる必要があったはずです。 それは正確ではないです。 引用符の種類によって変化するので以下が参考になるかと。 https://www.php.net/manual/ja/language.types.string.php ただ、そもそも文字列展開で、SQL を組み立てるのは NG なんですよねぇ。。。
退会済みユーザー

退会済みユーザー

2021/03/17 10:35

> te2ji様 補足ありがとうございます! 他にも展開方法はありますねっ、「必要が」というのが余計だったかな。 DBから数字引っ張るみたいな話だったのでSQLインジェクションの指摘はしなかったんですが、 可能であればもっと新しい書き方を学ぶべきかなぁとは思います。
退会済みユーザー

退会済みユーザー

2021/03/17 22:51

ちょっとうまく伝わってない気がするので追記します。 本件の元の "SELECT name FROM craft WHERE code="$codeno"" は SELECT name FROM craft WHERE code="hogehoge" を期待しているものと思われます。 そのため、 "SELECT name FROM craft WHERE code=".$codeno; としてしまうと SELECT name FROM craft WHERE code=hogehoge となり、期待する出力となりません。 まぁ、$codeno をたどると $num にあたるので最終的には数字を意識しているのでしょうけど、局所的に出来上がる文字列が変わってしまう事は伝えてあげる必要があると思います。 局所的に意図した文字列を生成するには "SELECT name FROM craft WHERE code=\"$codeno\"" あたりになるかと。
退会済みユーザー

退会済みユーザー

2021/03/18 01:32

> te2ji様 ご指摘ありがとうございます! 商品コードとのことですので、 DBに商品を登録していくのであれば数字でのナンバリングが一般的だと思われます。 ですので、僕は「$codeno」を「数値」であると捉えておりました。 回答で提示したコードで上手くいかない場合は、 数値が文字列になっている可能性を考慮し数値への変換を記述していただく。 もしくは、数値ではなく文字列として登録するのかどうかを確認するつもりでおりました。 文字列での登録と言われた場合は '".$codeno."'"この記述を回答として出すつもりでした。 だいぶ見づらいですがっ > "SELECT name FROM craft WHERE code=\"$codeno\"" "をエスケープして通す書き方もあるんですね。勉強になりました、ありがとうございます! 以下蛇足ではありますが、 コードを目で追って処理を脳内再生できる水準ではないため、 ある程度コミュニケーションを取りながら解決を目指すスタイルを取っております。 te2ji様、一目見て原因と解決方法が分かるのでしたら、 僕ではなくて質問者さんへ教えてあげてくださると非常に助かります。
退会済みユーザー

退会済みユーザー

2021/03/18 03:34

私の回答は、質問への追記・修正へ記述した通り「学習書を変える」ことです。 $dbh->query("set names utf8"); とかあるので、相当古い本を参考にしているのだろうと思われます。 古い php の学習書は、DB への接続/データ投入方法、XSS 対策をはじめとした基本的なセキュリティ対応が全く考慮されておらず、その状態で EC サイトのカートのコーディングとかさせるので非常に危ういものが多いです。 単純に、7系以降に対応しているものに変えるだけで大きく無駄が省けるので、学習書の変更が第一だと思ってます。
退会済みユーザー

退会済みユーザー

2021/03/18 04:39

> te2ji様 ご自身のスタンスの明示をありがとうございます! ここだとたぶん読まれないと思うので、 質問への追記・修正、ベストアンサー選択の依頼の方へ追記していただると助かります。 蛇足なのですが、古いコードは確かに遠回りです。 ただ、1つ完成させる前に別のコードを書く気力が湧くかどうかかなぁと。 レスポンスも特になさそうなので、たぶん萎える方が早そうな気がいたします。 まぁそこまで面倒を見る必要もないのですが。
songpu

2021/03/18 06:50

>te2ji様 内容の確認と書き込みが遅れまして申し訳ありませんでした。 様々な角度からご指導をいただきまして、大変感謝しております。 (正直最初は少し驚いて、え、、、と戸惑ってしまいました。。。) 学習(実現)したかった内容の書籍を購入して進めてしまったので、 そのような古い知識になっている部分もあったのだと理解しました。 現状この問題自体は解決していないのですが、他の箇所も含め作成のやり直しも考えたいと思います。 また私の質問が目に止まった時は、アドバイスいただければありがたいです。 ありがとうございました。
songpu

2021/03/18 07:08 編集

>amiya-se様 質問を投稿してからすぐにご回答をいただきましたのに、 内容の確認と書き込みが遅れまして申し訳ありませんでした。 こちらもしっかりと目を通しております。 amiya-se様ご自身がコミュニケーションを取りながら解決策を模索していただくことを大事にしているとのことで、内容も確認していないと思わせてしまったようで重ねてすみません。 とても親切にご指導をいただいたので、大変ありがたく感じました。 (ただ、すぐ確認・返信できない状況があることをご考慮いただければ、、、と思っています。) 現状この問題自体は解決していないのですが、te2jiさんからのご指摘も踏まえ、作成のやり直しも考えたいと思います。 また私の質問が目に止まった時は、アドバイスいただければありがたいです。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/03/18 09:36

> songpu様 あーっと、すみません。 僕自身はあまり反応が無くても気にしていないのですよ。 te2ji様くらいレスポンスされると記憶に残るんですが、 やりとりが少ないと記憶に残らないので…※人の顔も覚えられない 本買っちゃったならある程度は仕方ないかなぁとは思います。 ただ、サンクコスト?と割り切って、 新しい技術から学んだ方がトータルで見ると早いかもしれません。 フォローポチっておきますが、 僕はスキル低めなので他の方のアドバイスがあればそちらの方を優先してくださいね。 完全に蛇足なのですが、 今日teratailに夢中になり過ぎて洗濯物を干し忘れたので、 嫁様から禁止令が出るんじゃないかと戦々恐々しておりますです、ハイ… 禁止されなかった場合はわかる範囲で回答させていただきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問