🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

Q&A

解決済

2回答

1651閲覧

mysqli_real_escape_string文を書いたのですが、エラーの意味が理解できません。  syntax error, unexpected ',', expect ~25行目、

sawara29

総合スコア12

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

0グッド

0クリップ

投稿2019/10/22 04:16

編集2019/10/22 07:44

フォームからの情報を保存する為、input_do.phpとinput.phpを作りました。

問題の、input_do.phpです。25行目のmysqli_real_escape~で、私はphpバージョン7です。
教科書が、よくわかるphpの教科書なのですが、php7には対応してないです。

1

1 2 <html lang="ja"> 2 3 <head> 3 4 <meta charset="UTF-8"> 4 5 <title>トップページです。</title> 5 6 <meta name="viewport" content="width=device-width"> 6 7 <link rel="stylesheet" href="style.css"> 7 8 </head> 8 9 <body> 9 10 <?php 10 11 $link = mysqli_connect('localhost', 'root', 'root'); 11 12 //mydbをセレクトできていない 12 13 mysqli_select_db($link,"mydb"); 13 14 if (!$link) { 14 15 echo "データベース接続失敗" . PHP_EOL; 15 16 echo "errno: " . mysqli_connect_errno() . PHP_EOL; 16 17 echo "error: " . mysqli_connect_error() . PHP_EOL; 17 18 exit; 18 19 } 19 20 20 21 21 22 $sql = sprintf('INSERT INTO my_items SET maker_id=%d, item_name="%s", print=%d, keyword="%s"', 22 23 23 24 mysqli_real_escape_string($link, $_POST['maker_id']), 24 25 mysqli_real_escape_string($link, $_POST['item_name']), 25 26 mysqli_real_escape_string($link, $_POST['price']), 26 27 mysqli_real_escape_string($link, $_POST['keyword']) 27 28 ); 28 29 29 30 mysqli_query($sql) or die(mysqli_error()); 30 31 31 32 ?> 32 33 <p>商品を登録しました</p> 33 34 </body> 34 35 </html> 35

入力画面は問題なく、入力できて、送信ボタンを押すと、

syntax error, unexpected ',', expect ~25行目と出ます。

input_do.phpがこちらです。

 1 <p>登録する商品の情報を入力してください。</p> 2 <form id="frmInput" name="frmInput" method="post" action="input_do.php"> 3 <dl> 4 <dt> 5 <label for="maker_id">メーカーID</label> 6 </dt> 7 <dd> 8 <input name="maker_id" type="text" id="maker_id" size="10" maxlength="10" /> 9 </dd> 10 <dt> 11 <label for="item_name">商品名</label> 12 </dt> 13 <dd> 14 <input name="item_name" type="text" id="item_name" size="35" maxlength="255" /> 15 </dd> 16 <dt> 17 <label for="price">価格</label> 18 </dt> 19 <dd> 20 <input name="price" type="text" id="price" size="10" maxlength="10" /> 21 円</dd> 22 <dt> 23 <label for="keyword">キーワード</label> 24 </dt> 25 <dd> 26 <input name="keyword" type="text" id="keyword" size="50" maxlength="255" /> 27 </dd> 28 </dl> 29 <input type="submit" value="登録する" /> 30 </form> `` ード

問題点を教えて頂けたらありがたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

$_POST[$link,

連想配列の[]が閉じられていません。

投稿2019/10/22 04:18

m.ts10806

総合スコア80875

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

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

sawara29

2019/10/22 04:26

28行目の);で閉じられてませんか?
m.ts10806

2019/10/22 04:39

連想配列の話です。 $変数名[キー名]
m.ts10806

2019/10/22 04:41 編集

「そんな閉じ方はない」ですよ。 それにmysqli_real_escape_string()の構文も守られていません。 提示の書き方は引数がひとつしか与えられていない上に、その引数の連想配列もおかしいのでグチャグチャになっています。
m.ts10806

2019/10/22 04:49

フォーム送信の情報をfilter_intput()で受け取り、PDOで接続を制御し、プリペアドステートメントでSQL送信すれば今回のような問題は避けられると思います。(通常はmysqli_*ではなくPDOを使います)
sawara29

2019/10/22 07:25

ご指摘ありがとうございます、連想配列から、間違っており、PDOも未学習なので、復習して、再挑戦したいと思います。 教材で、mysqliを使用しているというのは、古いでしょうか?
m.ts10806

2019/10/22 08:35

プログラムは大抵「もっとも内側から」実行されるということを覚えておくと良いです。 > 教材で、mysqliを使用しているというのは、古いでしょうか? 「PHP7に対応していない」時点で古いのは間違いないですが、 PHP7対応とあっても焼き増しであることも多いです。 mysqli自体はPHP7で使えないわけではないですし、きちんと制御できるのであれば十分に効果を発揮します。 そもそもPHPマニュアル自体がWebサイトです。 PHPマニュアルを活用できるようになることが最優先ですべきことです(使えない人はいつまでも成長しないですし、teratailでずっと初心者質問をしています) プログラミングは日進月歩ですし、書籍の執筆時点では最新の技術を使っていても出版時点では古くなっていることも多いです。 それであればQiitaなどで評価が高く、新しい記事、更新がきちんとなされている記事を参照にすべきと思います。 データベース関係であれば下記などは有名です。 https://qiita.com/mpyw/items/b00b72c5c95aac573b71
guest

0

$_POST[$link, 'maker_id']が正しくありません。$linkオブジェクトは、mysqli_real_escape_stringの引数として与える必要があります。

…という以前に、わざわざsprintfmysqli_real_escape_stringのような手間なことをやるのではなく、プリペアドステートメントを使いましょう。

あと、後半にmysql_*関数も残っています。

投稿2019/10/22 04:20

maisumakun

総合スコア145975

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

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

sawara29

2019/10/22 04:37

$linkが、入ってはいけないということですね? 2つパラメーターが必要なので、入れたのですが、プリペアドステートメントは初めて聞きました。理解するために時間が必要です。
maisumakun

2019/10/22 04:40

> 2つパラメーターが必要なので、入れたのですが それは$_POSTに対してではなく、mysqli_real_escape_stringに対してです。
退会済みユーザー

退会済みユーザー

2019/10/22 06:22

つまり、教材が古い
sawara29

2019/10/22 07:20

指摘ありがとうございます。エラーが出るたびに、ネットで調べて場当たり的なってしまい、わからなくなってしまいました。教材を新しくすると、プリペアドステートメントを使うように、なりますか? 独学なので、遠回しになってる気がしてます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問