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

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

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

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

1回答

723閲覧

PDOにて、プレースホルダーを利用したい。

tech_first

総合スコア13

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2020/04/29 07:05

###PDOにて、プレースホルダーを利用したいです。

現在、phpにて簡単な管理画面を作成しております。
投稿を編集する際のクエリ

php

1$sql = "UPDATE news SET day = :day, title = :title, kind = :kind, body = :body WHERE id = :page";

こちらの:pageを$pageにすると上手く動くのですがプレースホルダを利用したいです。

###全体のソースコード

php

1//変数$pageにクエリを代入 2$page = $_GET[id]; 3 4 <?php 5 try { 6 $dbh = 'mysql:dbname=test_db;host=133.167.38.105;charset=utf8'; 7 $user = 'test'; 8 $password = ''; 9 10 $PDO = new PDO($dbh, $user, $password); 11 $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 12 //こちらが上記のsql文です。このidを$pageにすれば動きますがプレースホルダを利用したいです。 13 $sql = "UPDATE news SET day = :day, title = :title, kind = :kind, body = :body WHERE id = :page"; 14 $stmh = $PDO->prepare($sql); 15    //こちらのbindValueを使って:pageに$pageの値をバインドしています。 16 $stmh->bindValue(":page", $page, PDO::PARAM_INT); 17 $result = $stmh->execute([ 18 ':day' => filter_input(INPUT_POST, 'day'), 19 ':title' => filter_input(INPUT_POST, 'title'), 20 ':kind' => filter_input(INPUT_POST, 'kind'), 21 ':body' => filter_input(INPUT_POST, 'body'), 22 ]); 23 if ($result) { 24 $message = ''; 25 } 26 } catch (PDOException $e) { 27 $error = 'データベースに接続できませんでした。' . $e->getMessage(); 28 } 29?>

削除機能などはこの文法で実装できたので、どこが悪いのかいまいち分かりません。

###やってみたこと

どこが間違えているかを明確にするために$pageと:pageで試した

$pageの場合
編集が実行された。

:pageの場合
エラーなどは一切表示されないが、データの更新だけが行えない。

var_dump($page);
の結果には欲しいクエリ番号が代入されていた。

初心者な質問で大変申し訳ありませんが、ご回答いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

残念ながら、プレースホルダに値をバインドする場合、「bindValueなどを使う」か「executeでセットするか」のどちらか一方しか使えません。

「1つだけbindValueを行って、残りをexecuteの引数にする」ような実行は成立しない、とのことです(PHPマニュアル)。

投稿2020/04/29 07:34

maisumakun

総合スコア146018

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

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

tech_first

2020/04/29 07:48

ご回答いただきましてありがとうございました! つまり、 $result = $stmh->execute([ ':day' => filter_input(INPUT_POST, 'day'), ':title' => filter_input(INPUT_POST, 'title'), ':kind' => filter_input(INPUT_POST, 'kind'), ':body' => filter_input(INPUT_POST, 'body'), ]); このexecuteの引数に':page' => $page を追加すれば良いのでしょうか?
maisumakun

2020/04/29 07:53

そうですね、型の問題がなければexecuteへの追加でも構いませんし、逆に全部bindValueで書き直すという選択肢もあります。
tech_first

2020/04/29 08:08

ありがとうございました! 解決いたしました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問