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

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

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

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

SQL

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

5430閲覧

Error:SQLSTATE[HY000]: General errorというエラーが出てきます。

noizi.

総合スコア27

MySQL

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

SQL

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

PHP

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

2クリップ

投稿2021/01/11 04:41

前提・実現したいこと

以下のコードを実行するとError:SQLSTATE[HY000]: General errorが出てきます。
SQL文が原因なのは分かりますが、どこがいけないのかよくわかりません。
よろしくお願いします。

ちなみに下記のコードはデータベースのデータを修正するコードです。

該当のソースコード

<?php $dsn = 'mysql:dbname=example;host=localhost'; $user = 'root'; $password = 'shapshap'; try{ $dbh = new PDO($dsn, $user, $password); $C_nam = $_GET['C_nam']; $C_nm = $_GET['C_nm']; $C_phn = $_GET['C_phn']; $C_add = $_GET['C_add']; $sql = 'UPDATE example SET C_nam = "'.$C_nam.'", C_nm = "'.$C_nm.'", C_phn = "'.$C_phn.'", C_add = "'.$C_add.'" WHERE example.C_nm = "'.$C_nm.'"'; foreach ($dbh->query($sql) as $row) { $get_C_nam[] = $row['C_nam']; $get_C_nm[] = $row['C_nm']; $get_C_phn[] = $row['C_phn']; $get_C_add[] = $row['C_add']; } } catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } $dbh = null; ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width"> <title>顧客検索</title> <link rel="stylesheet" href="ser_style.css"> </head> <body> <div class="content"> <h1>以下の内容で修正します。</h1> <div class="control"> <label for="C_nam">顧客名</label> <input id="C_nam" type="text" name="C_nam" value="<?php print($get_C_nam[0]); ?>"> </div> <div class="control"> <label for="C_nm">顧客番号</label> <input id="C_nm" type="number" name="C_nm" value="<?php print($get_C_nm[0]); ?>"> </div> <div class="control"> <label for="C_phn">顧客電話番号</label> <input id="C_phn" type="tel" name="C_phn" value="<?php print($get_C_phn[0]); ?>"> </div> <div class="control"> <label for="C_add">顧客住所</label> <input id="C_add" type="text" name="C_add" value="<?php print($get_C_add[0]); ?>"> </div> <form action="c_search.php" method="GET"> <div class="control"> <input type="submit" value="確定"> </div> </form> <form action="c_search_ans.php" method="GET"> <div class="control"> <input type="submit" value="戻る"> </div> </form> </div> </div> </body> </html>

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

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

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

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

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

guest

回答1

0

ベストアンサー

まずpdoを利用しているならprepareで処理してください
またupdate文には出力がありませんのでqueryの結果をforeachできません
updateしたあとに確認したいならselectしてください

投稿2021/01/11 04:55

yambejp

総合スコア114845

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

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

noizi.

2021/01/11 05:05

回答ありがとうございます。とりあえずやってみます。 また、確認ですが、foreachの部分は消して、selectで結果を出すようにした方がよいということですか?
noizi.

2021/01/11 05:22

あと、もう一つ質問です。 prepareを使うときはexecuteもつかったほうがいですか?
yambejp

2021/01/11 05:57

foreachを利用するなら出力するものがないと意味がないので selectしないといけないということ prepare処理はexecuteとセットです
noizi.

2021/01/11 08:52

分かりました。教えて頂きありがとうございます。 prepareとexecuteは下記のような使い方でよろしいでしょうか? $sql = $db->prepare('UPDATE example SET C_nam = "'.$C_nam.'", C_nm = "'.$C_nm.'", C_phn = "'.$C_phn.'", C_add = "'.$C_add.'" WHERE example.C_nm = "'.$C_nm.'"'); $sql = 'select * from example; $sql->execute();
noizi.

2021/01/11 08:53

上記の通りselectで出力できるようにしました。
退会済みユーザー

退会済みユーザー

2021/01/12 01:03

引用符のつけるつけないで消耗するくらいなら、さっさとプリペアドステートメントを駆使するやり方に変えたほうがいいって、以前の質問でアドバイスしたような気がするけど、伝わらないんだろうなぁ。
yambejp

2021/01/12 02:54

こまかい検証はしてないですが流れだけ書くと $stmt = $db->prepare('UPDATE example SET C_nam =?,C_phn=?,C_add =? WHERE example.C_nm = ?); $data=[$C_nam,$C_phn,$C_add,$C_nm]; $stmt->execute($data); $sql = 'select * from example'; $db->query($sql); $stmt->execute();
noizi.

2021/01/13 08:22

皆さん、いろいろと返信ありがとうございます。とりあえず、いろいろ試してみることにします。 また、m6uさんのおっしゃっているプリペアドステートメントについてですが、自分の理解力の無さで上手く理解することができませんでした。 すいませんでした。 もう少し理解できるように努力します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問