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

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

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

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

Q&A

解決済

2回答

953閲覧

PHPにて、データの更新をしたいです。

tech_first

総合スコア13

PHP

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

0グッド

0クリップ

投稿2020/04/23 07:09

PHPにて、データの更新をしたいです。

ある企業の課題で、phpを使ってデータの管理画面を作成しております。
データの登録(INSERT)はできたのですが、更新(UPDATE)ができません。

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

Fatal error: Uncaught Error: Call to a member function query() on string in /var/www/html/edit_news.php:156 Stack trace: #0 {main} thrown in /var/www/html/edit_news.php on line 156

該当のソースコード

php

1<?php 2 $sql = null; 3 $res = null; 4 $dbh = null; 5 try { 6 $dbh = 'mysql:dbname=test_db;host=133.167.38.105;'; 7 $user = 'test'; 8 $password = 'password'; 9 10 $PDO = new PDO($dbh, $user, $password); 11 $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 12 13 $day = $_POST['day']; 14 $title = $_POST['title']; 15 $kind = $_POST['kind']; 16 $body = $_POST['body']; 17 18 19 $PDO->query("SET NAMES utf8;"); 20 $sql = "UPDATE news SET (day, title, kind, body) VALUES (:day, :title, :kind, :body) WHERE id = $page"; 21 $res = $dbh->query($sql); 22 23 echo "<p>day: ".$day."</p>"; 24 echo "<p>title: ".$title."</p>"; 25 echo "<p>kind: ".$kind."</p>"; 26 echo "<p>body: ".$body."</p>"; 27 echo '<p>で登録しました。</p>'; 28 } catch (PDOException $e) { 29 exit('データベースに接続できませんでした。' . $e->getMessage()); 30 } 31 ?>

こちらが登録完了画面です。

ちなみに156行目は

php

1$res = $dbh->query($sql);

こちらの部分でして、ここが悪いことは分かっているのですが具体的にどこが悪いのか分かりません。

試したこと

$dbhの変数の初期化を行いました。
エラー文的に、おそらくnullか何も値が入っていない状態でsqlを実行しようとしているような気がしています。

補足情報(FW/ツールのバージョンなど)

フレームワークわ使っておらず、生の文章で書いております。
どうか、お願い致します。

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

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

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

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

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

guest

回答2

0

回答

$res = $dbh->query($sql);

$res = $PDO->query($sql);

エラー自体はこれで解決しますが、別のエラーが出るはずです。
それは順にデバッグしてみてください。
(INSERTは出来ているという事なので、INSERTとの違いを比較するだけでも解決しそうな気がします。)


解説

Call to a member function query() on string
ですから、
$res = $dbh->query($sql);

$dbh
stringになってしまっているということです。
ただの文字列はquery()メソッドを持っていないのでエラーになります。

PHP

1 2var_dump($dbh); 3$res = $dbh->query($sql);` 4

などで$dbhの中身を確認してみましょう。
PHP デバッグ方法あたりで検索して、デバッグ方法を把握させることをお勧めします)

query()PDOクラスのメソッドなので
PHPマニュアル PDO
PDOクラスのオブジェクトである$PDOで実行する必要があります。

ヒント

おそらく、課題としては
PDO::prepare()

PDO::execute()
を使うことを想定していると思われます。

PHPマニュアル PDO::prepare
のサンプルを参考にして実装してみてください。

投稿2020/04/23 07:32

tanat

総合スコア18727

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

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

tech_first

2020/04/30 14:33

ご回答心より感謝いたします。 データの型も意識してコードを組まないといけないのですね。 マニュアル参考にしてみます!ありがとうございました!
guest

0

ベストアンサー

php

1<?php 2 3// $sql = null; 4// $res = null; 5// $dbh = null; 6 7 try { 8 //$dbh = 'mysql:dbname=test_db;host=133.167.38.105;'; 9 $dbh = 'mysql:dbname=test_db;host=133.167.38.105;charset=utf8'; 10 11 $user = 'test'; 12 $password = 'password'; 13 14 $PDO = new PDO($dbh, $user, $password); 15 $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 16 17// $day = $_POST['day']; 18// $title = $_POST['title']; 19// $kind = $_POST['kind']; 20// $body = $_POST['body']; 21 22// $PDO->query("SET NAMES utf8;"); // こんなことしちゃダメ 23 24   // UPDATE文の間違い 25 // $sql = "UPDATE news SET (day, title, kind, body) VALUES (:day, :title, :kind, :body) WHERE id = $page"; // 変数を直接埋め込むなよ 26 $sql = "UPDATE news SET day = :day, title = :title, kind = :kind, body = :body WHERE id = :page"; 27 $stmt = $PDO->prepare($sql); 28 $result = $stmt->execute([ 29 ':day' => filter_input(INPUT_POST, 'day'), 30 ':title' => filter_input(INPUT_POST, 'title'), 31 ':kind' => filter_input(INPUT_POST, 'kind'), 32 ':body' => filter_input(INPUT_POST, 'body'), 33 ':page' => $page // $page が未定義だが、質問文に説明がないので知らん。 34 ]); 35 if ($result) { 36 $message = 'データベースの更新に成功しました。'; 37 } 38 } catch (PDOException $e) { 39 $error = 'データベースに接続できませんでした。' . $e->getMessage(); 40 } 41?> 42<html> 43<?php if ($error) ?> 44 <?php echo htmlspecialchatrs($error) ?> 45<?php endif; ?> 46<?php if ($message) ?> 47 <?php echo htmlspecialchatrs($message) ?> 48<?php endif; ?> 49</html>

投稿2020/04/23 07:26

編集2020/04/23 07:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tech_first

2020/04/30 14:34

ご回答いただきありがとうございました。 プレースホルダの利用など、もっと基礎から勉強する必要があると感じました。 心より感謝いたします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問