ID非公開

2020/9/17 10:08

22回答

プログラミング初心者です。 専門学生より知識のない一般人です、かみ砕いて教えてください。

プログラミング初心者です。 専門学生より知識のない一般人です、かみ砕いて教えてください。 mysqlからデータを取得する際に、検索画面にて名前を入力するとその名前を参照したデータを引っ張ってくるやり方、php、表示するhtmlを知りたいです。 ネットで調べてもid等を指定して引っ張ってきてるやり方ばかりで、入力されたものに対応するデータを表示するやり方がわかりません。 書き換えが必要なとこもわかりやすくしてくれるとありがたいです。 $dsn = 'mysql:dbname=???;host=???;charset=utf8'; $user = '???'; $password = '???'; みたいな感じです。 COL1 COL2 COL3 太郎 9月 5000円 次郎 9月 3000円 三郎 9月 1000円 太郎 10月 2000円 検索フォーム 【 】「検索」 に太郎と入力されたら太郎のデータを両方とも引っ張ってくるようなものです。 太郎 9月 5000円 10月 2000円 と表示されるイメージです。 idがデータ内にはないです。必要ならば、excelからデータをインポートする際に1から振るので、idがあるものと考えてくれて大丈夫です。

MySQL | PHP67閲覧xmlns="http://www.w3.org/2000/svg">500

ベストアンサー

1

前回の質問と、どこがどう違うのか・・・ https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10231683770 #前回の回答は動作確認されましたか? name属性値をcolumn1としたのを(「名前」の入力なので)nameに変更して、入力した名前と完全一致でよければ <?php $name = filter_input(INPUT_POST, 'name'); if (!empty($name)) { // POSTデータの処理 $result = sprintf('<h2>%s の検索結果</h2>', htmlspecialchars($name, ENT_QUOTES)); $dsn = 'mysql:host=localhost;dbname=test;charset=utf8mb4'; $user = 'root'; $pass = ''; try { $pdo = new PDO($dsn, $user, $pass, [PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]); $stmt = $pdo->prepare('select * from テーブル名 where col1=? order by id'); // idカラムがあるかどうかわからないけど、とりあえず「並び」を決めないといけないので $stmt->execute([$name]); $ct = 0; while ($row = $stmt->fetch()) { $ct++; $result .= sprintf('%d件め:%s:%s<br>', $ct, $row['COL2'], $row['COL3']); if ($ct >= 100) break; } } catch (PDOException $e) { $errmsg = $e->getMessage(); unset($result); } } else { // POSTデータなし $form =<<<EOM <form method="post"> <input type="text" name="name"> <input type="submit"> </form> EOM; } ?> <!DOCTYPE html> <html> (中略) <?= isset($errmsg) ? $errmsg : '' ?> <?= isset($result) ? $result : '' ?> <?= isset($form) ? $form : '' ?> #表示のフォーマットなどは適宜書き替えてください 完全一致なら上記のとおりですが、部分一致で like を使うときにはちょっと工夫が必要です。プリペアするSQL文は like ? でいいのですが、引き渡す文字列に含まれる % や _ をエスケープしないといけません(like に渡すので意味が出てくる記号のため、システム側ではエスケープしてくれない)。 $stmt = $pdo->prepare('select * from テーブル名 where col1 like ? order by id'); $stmt->execute(['%' . addcslashes($name, '\_%') . '%']);

1人がナイス!しています

ID非公開

質問者

2020/9/17 11:03

確認しました。 自分なりに必要部分を書き換えやりましたが、できなかったから投稿しました。 できてたら投稿しません。

ThanksImg質問者からのお礼コメント

動きました。ありがとうございました。

お礼日時:9/30 14:52

その他の回答(1件)

0

> 検索画面にて名前を入力するとその名前を参照したデータを引っ張ってくるやり方、php、表示するhtmlを知りたい 全部は書けませんから、「やり方」を 先ずは、対象となる名前を入力する検索画面を作ります。 __action属性値は、検索実行用 PHPスクリプト 検索実行用 PHPスクリプトでは、受け取った検索対象の名前をデータベースに問い合わせて結果を表示します。 表示用のHTMLを作っておいてください。 __結果を表示する部分には __<!-- ここに結果を挿入する --> __とでもしておく データベースへの接続は、(何となく書かれてはいますが)PDOを使うのが良いと思います。 https://www.php.net/manual/ja/pdo.connections.php データベースへ問い合わせる際はSQLを使うのですが、例示の「太郎のデータを(両方とも)引っ張ってくる」をSQLで書けますか? これが全く出来ないと、SQLの基本からやる必要があります。 大凡の場合、質問時の例と実際にやりたい事は違うので、SQLの知識無しに回答を実際の状況に合わせる事が出来ませんし、将来の変更にも対応できません。 一旦 SQLで書いたら、それを元にプリペアドステートメント用に書き直してから使いましょう。 https://www.php.net/manual/ja/pdo.prepare.php __簡単にやる為に「疑問符パラメータ」を使って __バインドを考えずにやるのをお勧めします 結果の取得は、全部を取得してから処理するのでも、1件毎に処理するのでも構わないと思います。 ただし、単に全部を取得してそれを foreach()するだけなら、わざわざ別の変数に取り出さなくても $pdo = new PDO( ... ); $sth = $pdo->prepare( ... ); $sth->execute(array( ... )); であれば、foreach($sth as $row) の様に取り出せるので、こちらをお勧めします。 結果を取得したら、それを元に表示用の HTMLデータを生成します。 tableタグを使うのか、ul あるいは nl タグを使うのか、div span p タグなどで表現するかはご自由に。 必要なのは、データベースから取得したデータとはいえ「外部から取得したデータ」であるので、必ず HTML用のエスケープを施してから使う事です。 __htmlspecialchars() __https://www.php.net/manual/ja/function.htmlspecialchars 後で使うので、これらを変数に収めておきます。 生成したデータは、先ほどの <!-- ここに結果を挿入する --> の所で表示する様にすれば、一応の完了です。 必要があれば、class属性値や id属性値をタグにつけておいて、スタイルシートで調整すれば良いでしょう。 > idがデータ内にはないです データベースのデータに idが無いのは特別な場合を除いて避けるべきと思います。

ID非公開

質問者

2020/9/17 12:08

php、htmlに関してはうぶ毛が生えた程度の知識はありますが、sqlは毛も生えてないですね。。 参考にします。ありがとうございます。