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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

4回答

1231閲覧

phpでmysqlエラーが解決できません

spcl

総合スコア19

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

0クリップ

投稿2018/07/03 07:58

質問しつれいします。

phpでmysqlを使ってデータベースの更新をしたいのですがエラーが表示されてしまいます。
どこを直せばいいのか分からず困っています。
表示されるエラーは
Warning: sprintf(): Too few arguments in C:\xampp\htdocs\menu\update_do.php on line 11
です。

ソースコードは以下になります。

[index.php]

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>登録メニュー一覧</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <?php require('dbconnect.php'); ?> <div id="menu_list"> <table class="menu_list"> <tr> <th>商品管理ID</ht> <th>カテゴリー</ht> <th>商品名</ht> <th>価格</ht> <th>備考</ht> <th>編集</ht> <th>削除</ht> </tr> <?php $recodeSet = $mysqli->query('SELECT * FROM menu ORDER BY id'); while($table = mysqli_fetch_assoc($recodeSet)){ ?> <tr> <td><?php echo(htmlspecialchars($table['id'])); ?></td> <td><?php echo(htmlspecialchars($table['kind'])); ?></td> <td><?php echo(htmlspecialchars($table['name'])); ?></td> <td><?php echo(htmlspecialchars($table['price'])); ?></td> <td><?php echo(htmlspecialchars($table['remarks'])); ?></td> <td><a href="update.php?id=<?php echo(htmlspecialchars($table['id'])); ?>">編集</a></td> <td><a href="delete.php?id=<?php echo(htmlspecialchars($table['id'])); ?>">削除</a></td> </tr> <?php } ?> </table> </div> </body> </html>

[update.php]

<?php require('dbconnect.php'); $id = $_REQUEST['id']; $sql = sprintf("SELECT * FROM menu WHERE id = %d", $mysqli->real_escape_string($id) ); $recodeSet = $mysqli->query($sql); $data = mysqli_fetch_assoc($recodeSet); ?> <p>変更する内容を記入してください。</p> <form id="frmUpdate" name="frmUpdate" method="post" action="update_do.php"> <dl> <dt> <label for="id">IDを変更する場合のみ入力してください。</label> </dt> <dd> <input type="number" id="id" name="id" value="<?php echo(htmlspecialchars($data['id'], ENT_QUOTES)); ?>" > </dd> <dt> <label for="kind">種類</label> </dt> <dd> <input type="text" id="kind" name="kind" value="<?php echo(htmlspecialchars($data['kind'], ENT_QUOTES)); ?>" > </dd> <dt> <label for="name">商品名</label> </dt> <dd> <input type="text" id="name" name="name" size="40" value="<?php echo(htmlspecialchars($data['name'], ENT_QUOTES)); ?>" > </dd> <dt> <label for="price">価格</label> </dt> <dd> <input type="number" id="price" name="price" value="<?php echo(htmlspecialchars($data['price'], ENT_QUOTES)); ?>" > </dd> <dt> <label for="remarks">備考欄</label> </dt> <dd> <input type="text" id="remarks" name="remarks" size="255" value="<?php echo(htmlspecialchars($data['remarks'], ENT_QUOTES)); ?>" > </dd> </dl> <input type="submit" value="更新する"> <input type="hidden" name="id" value="<?php echo(htmlspecialchars($data['id'], ENT_QUOTES)); ?>" </form>

[update_do.php]

<?php require('dbconnect.php'); $id = $_REQUEST['id']; $sql = sprintf('UPDATE menu SET id=%d, kind="%s", name="%s", price=%d, remarks="%s" WHERE id =%d', $mysqli->real_escape_string($_POST['id']), $mysqli->real_escape_string($_POST['kind']), $mysqli->real_escape_string($_POST['name']), $mysqli->real_escape_string($_POST['price']), $mysqli->real_escape_string($_POST['remarks']) ); ?> <p>更新しました</p>

以上になります。

解決方法がお分かりになる方がいらっしゃいましたらご教授お願いします。

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

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

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

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

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

guest

回答4

0

php

1$sql = sprintf('UPDATE menu SET id=%d, kind="%s", name="%s", price=%d, remarks="%s" WHERE id =%d', 2 $mysqli->real_escape_string($_POST['id']), 3 $mysqli->real_escape_string($_POST['kind']), 4 $mysqli->real_escape_string($_POST['name']), 5 $mysqli->real_escape_string($_POST['price']), 6 $mysqli->real_escape_string($_POST['remarks']) 7);

%s, %d の数が合わせて6個。
に対して $mysqli->real_escape_string() の数が5個

余談だけど、これ「MySQLのエラー」ではありません。sprintf は文字列関数ですから。
http://php.net/manual/ja/function.sprintf.php

投稿2018/07/03 08:00

編集2018/07/03 08:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

spcl

2018/07/03 08:22

ご回答ありがとうござういます。 数を合わせたところエラーは表示されなくなったのですが更新ができません。 このような形で試してみましたがエラーは表示されませんが更新もされません。 $sql = sprintf('UPDATE menu SET id=%d, kind="%s", name="%s", price=%d, remarks="%s" WHERE id ='.$id.'', $sql = sprintf("UPDATE menu SET id=%d, kind="%s", name="%s", price=%d, remarks="%s" WHERE id ='.$id.'", $sql = sprintf("UPDATE menu SET id=%d, kind='%s', name='%', price=%d, remarks='%s' WHERE id ='.$id.'", どの要にすればWHERE id = の部分で$idを使えるのでしょうか?
spcl

2018/07/03 08:30

度々のご回答ありがとうございます。 ヒントを元に探ってみます!
m.ts10806

2018/07/03 08:37

そもそもSELECTは実行できているわけですし。
spcl

2018/07/04 05:44

Kosuke_Shibuya様のお教えいただいたURLのページをみているのですが初心者の私には少し該当のページを探すのは難しいです。 もし可能でしたらどのページを読めばいいのか教えていただけないでしょうか? ちなみにこれが正解かと思いましたがだめでした。 $sql = sprintf('UPDATE menu SET id=%d, kind="%s", name="%s", price=%d, remarks="%s" WHERE id=%d', $mysqli->real_escape_string($_POST['id']), $mysqli->real_escape_string($_POST['kind']), $mysqli->real_escape_string($_POST['name']), $mysqli->real_escape_string($_POST['price']), $mysqli->real_escape_string($_POST['remarks']), $mysqli->real_escape_string($_POST['catgid']) ); または $catgid = $_POST['catgid']; $sql = sprintf('UPDATE menu SET id=%d, kind="%s", name="%s", price=%d, remarks="%s" WHERE id=%d', $mysqli->real_escape_string($_POST['id']), $mysqli->real_escape_string($_POST['kind']), $mysqli->real_escape_string($_POST['name']), $mysqli->real_escape_string($_POST['price']), $mysqli->real_escape_string($_POST['remarks']), $mysqli->real_escape_string($catgid) );
spcl

2018/07/04 05:56

ちょうど知っている人に会ったので教えてもらいました! $mysqli->query($sql) これつけるといけました! この度は素人の私に優しく教えていただきありがとうございました! 次からは丸投げのようにならないように気をつけます。
退会済みユーザー

退会済みユーザー

2018/07/04 05:59

提示されている部分は、「$sql に文字列を代入しているだけ」という意味は理解されていますか? PHPからMySQLを操作するためには、SQL文を接続したMySQLに問い合わせしなければいけません。 あなたのコードはまだMySQLに問い合わせしていないのです。 mts10806さんのコメントに「SELECTは実行できている」とありますが、SELECTのとき、あなたは「$mysqli->query($sql);」を実行することで、SQLに問い合わせしていますよね?理解しているかどうかは置いておいて、そういうコードを書いているのです。 UPDATEやINSERTでも「問い合わせ」して初めてMySQLがう動くのです。
m.ts10806

2018/07/04 06:19

spclさん ちょっと前に似たような現象に対して回答した覚えがあったので置いときますね。 https://teratail.com/questions/131878#reply-201184 > 本当に下記コードがそのままだとしたらifの条件がDB問い合わせ結果ではなく"単なる文字列だから"です。 >SQL文をきちんとDBに届けてあげてください。 質問は未解決ですしあまり質問内容も良くないですが。 調べ方もスキルの内なので調べ方から改善すると質問しなくてもできるようになってきます。
spcl

2018/07/04 06:25

ありがとうございます! お教えいただいた回答でもおっしゃっているようにコピペがほとんどなのでできるだけコピペせずにがんばります!上達したいので! 調べるスキルもがんばってつけます! この度は本当にありがとうございました!!
m.ts10806

2018/07/04 06:31

いえ。「意味が分からないままコピペで使うな」ということです。 そこそこの熟練者であってもPHPマニュアルの内容を全て暗記しているわけではありません。 時にネットで検索して出てきたコードをコピペして使うこともあるでしょう。 ただ「単にそれっぽいからコピペした」か「自身のコードに適切に的確に埋め込んで活用するためにコピペしたか」で大きく違うのです。 コピペコードを活かすも殺すも使う人次第です。自分のコードは自分が一番知っている、責任は自分しかとれない そういう意思をもってプログラムを組んでください。
退会済みユーザー

退会済みユーザー

2018/07/04 06:35

そうですね。熟練した人はコピペしないなんて神話です。 コピペします。だけど、リリースするからには自分の責任ですから、理解し、責任を負えるコードを書いているということ。 今回の場合、mysqli::query() という関数の意味や役割を理解せずにSELECT文を書いていたことの方が問題で、mysqli::query() を知らなかったことは大きな問題ではありません。
guest

0

idカラムはint型になっていますか?
それにしてもsprintfとreal_escape_stringでインジェクション対策
するのは前時代的ですね
mysqliにもプレースホルダーがあるので可能な限りそちらをご利用ください

投稿2018/07/03 08:31

yambejp

総合スコア114779

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

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

spcl

2018/07/03 11:17

ご回答ありがとうございます。 インジェクション対策、プレースホルダー、初めて聞いた言葉なので調べます! 教えていただきありがとうございます!
guest

0

他の回答者様と重複になるので、別解のヒントを。

http://php.net/manual/ja/function.sprintf.php#example-5983

こちらの方法では、sprintfの第2引数以降の指定は変更せず、第1引数のフォーマット文字列の修正を行います。

混乱させてしまいましたらすみません。。

投稿2018/07/03 08:17

SE-studying-now

総合スコア351

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

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

spcl

2018/07/03 08:23

助言ありがとうございます! ちょっと難しそうですが見てみます。
SE-studying-now

2018/07/03 08:36

こういうやり方もあるよ程度の提案ですので、まずは他の方の指摘を理解して質問内容を解消して頂ければと思います。
guest

0

ベストアンサー

エラーメッセージでまず調べましょう。

Too few arguments

Google翻訳:引数が少なすぎる

用意された箱の数と、入れる物の数は一致させてください。
多くても少なくてもいけません。

投稿2018/07/03 08:05

m.ts10806

総合スコア80850

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

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

spcl

2018/07/03 08:23

ご回答有りがりがとうございます。 理解できました!
m.ts10806

2018/07/03 08:35

どこをどう理解したか分かりませんが、私が本当に理解して欲しいのは1行目です。 https://teratail.com/help/question-tips#questionTips1-2 > 投稿前に自分で一度調べてみましょう。そして調べたことを元に、一度は自分でやってみましょう。 調べた感、何もやってない感が出ると「丸投げ」となり回答がつきづらくなります。 質問者さんの場合は、「初心者アイコン」をつけられたほうが良いかと思います。 質問は編集できるので自身で調べたことやってみたことを追記してください。
spcl

2018/07/03 11:20

引数が少なかったということが理解できました! Too few argumentsに関しましても調べたところ引数が少ないという警告という意味と解釈しましたがあっていますでしょうか? ばりばりの初心者なのでアイコンつけます! いろいろありがとうございます。
m.ts10806

2018/07/03 11:49

質問は編集できるので現状とあわせて質問内容を更新しておいてください。 「まず調べてやってみてからその結果をもって質問する」がteratailの使い方なので 何も調べず丸投げするのはやめてくださいね。今回も丸投げといえば丸投げです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問