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

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

ただいまの
回答率

90.51%

  • PHP

    20349questions

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

  • MySQL

    5854questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 245

spcl

score 10

質問しつれいします。

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>

以上になります。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+1

$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'])
);

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 17: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を使えるのでしょうか?

    キャンセル

  • 2018/07/03 17:24

    $sql に文字列をセットしているだけですから当然です。
    http://php.net/manual/ja/book.mysqli.php

    こちらを参考に

    キャンセル

  • 2018/07/03 17:30

    度々のご回答ありがとうございます。

    ヒントを元に探ってみます!

    キャンセル

  • 2018/07/03 17:37

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

    キャンセル

  • 2018/07/04 14: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)
    );

    キャンセル

  • 2018/07/04 14:56

    ちょうど知っている人に会ったので教えてもらいました!
    $mysqli->query($sql)
    これつけるといけました!

    この度は素人の私に優しく教えていただきありがとうございました!
    次からは丸投げのようにならないように気をつけます。

    キャンセル

  • 2018/07/04 14:59

    提示されている部分は、「$sql に文字列を代入しているだけ」という意味は理解されていますか?
    PHPからMySQLを操作するためには、SQL文を接続したMySQLに問い合わせしなければいけません。
    あなたのコードはまだMySQLに問い合わせしていないのです。

    mts10806さんのコメントに「SELECTは実行できている」とありますが、SELECTのとき、あなたは「$mysqli->query($sql);」を実行することで、SQLに問い合わせしていますよね?理解しているかどうかは置いておいて、そういうコードを書いているのです。

    UPDATEやINSERTでも「問い合わせ」して初めてMySQLがう動くのです。

    キャンセル

  • 2018/07/04 15:19

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

    質問は未解決ですしあまり質問内容も良くないですが。

    調べ方もスキルの内なので調べ方から改善すると質問しなくてもできるようになってきます。

    キャンセル

  • 2018/07/04 15:25

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

    キャンセル

  • 2018/07/04 15:31

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

    キャンセル

  • 2018/07/04 15:35

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

    キャンセル

checkベストアンサー

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 17:23

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

    キャンセル

  • 2018/07/03 17:35

    どこをどう理解したか分かりませんが、私が本当に理解して欲しいのは1行目です。

    https://teratail.com/help/question-tips#questionTips1-2
    > 投稿前に自分で一度調べてみましょう。そして調べたことを元に、一度は自分でやってみましょう。

    調べた感、何もやってない感が出ると「丸投げ」となり回答がつきづらくなります。
    質問者さんの場合は、「初心者アイコン」をつけられたほうが良いかと思います。
    質問は編集できるので自身で調べたことやってみたことを追記してください。

    キャンセル

  • 2018/07/03 20:20

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

    キャンセル

  • 2018/07/03 20:49

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

    キャンセル

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 17:23

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

    キャンセル

  • 2018/07/03 17:36

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 20:17

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    動的にレコードを更新するプログラムにおいて、レコードを更新するパートができない

    動的にレコードを更新するプログラムをつくっています。 update2のボタンを押してレコードを選択すると、名前や値段を入力するフォームが表示され、それに入力すればレコードを更新で

  • 解決済

    【PHP】ログイン機能の実装

    PHP初心者です。 PHPの勉強がてら、会員制のページを作成してます。 新規会員登録機能は実装できていますが、 ログイン機能の実装がうまくいきません。 やりたいことを実

  • 解決済

    PHPで質問フォームを作ったところ、$_POSTがうまくいかない

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>narratica</t

  • 解決済

    アンケートフォームのバリデーションチェックについて

    前提・実現したいこと Atomを用いてPHPとHTMLを使ったアンケートフォームを作っており、 「アンケートと同じページでエラーチェックを行い、 エラーはその場に表示する」 という

  • 解決済

    PHP MySQL の連携

    PHPのWEBサイトで名前、年齢を登録ボタンを押すとMYSQLのテーブルに格納させる設定方法を教えて下さい。(レンタルサーバで各ソフトはインストールしています。)  PHPとMYS

  • 解決済

    [PHP]POSTに失敗してしまいます

    PHP勉強中の者です。現在自動販売機作成ツールの管理画面を作成しているのですが、POSTの処理につまずいてしまっています。 ご教授頂ければ幸いです。 現在作成しているコードは以下の

  • 受付中

    セッションへ保存するための処理について

    [数量入力ページ]にて商品の数量を入力し、[結果ページ]へ遷移後、数量追加ボタンにて[数量入力ページ]へ戻り、 再度、数量追加を行える仕様にしたいと考えております。 また、数量

  • 解決済

    SESSIONで掲示板みたいにしたいのです。

    セッションで掲示板みたいにしたいのですが、 (現在セッションの配列について勉強中でして、自分だけが見られればOKです。以下は勉強のためのコードです) フォームを送信したら配列の中身

同じタグがついた質問を見る

  • PHP

    20349questions

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

  • MySQL

    5854questions

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