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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

Q&A

3回答

352閲覧

フランス語のTEXTデータをphpとMysqlで記録したいが『’』が頻繁にあるためエラー

4351kujira

総合スコア1

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

0グッド

0クリップ

投稿2024/03/27 01:12

編集2024/03/27 05:44

実現したいこと

以下のインサート文をエラー無しに実行したいのです。

発生している問題・分からないこと

例えば、je t'attendrai auの 「’ 」 が問題で、それを他の文字に置き換えれば動く事はわかります。
しかし、できればそのまま実行したいのです。
フランス語の場合に何かの設定を変えればいいのでしょうが、
検索しても、フランス語のエラーコードを出す記事しか見つかりません。
よろしくご指導ください。

該当のソースコード

Mysql

1INSERT INTO `memo` ( `user_id` , `memo` , `datatype`) VALUES ('kujira','Allô Sophie ? Oui, Allô, je serai en retard de quelques minutes. Quand je suis arrivé à la gare. Le train était déjà parti. Je suis désolé, pas de souci, je t'attendrai au guichet. Je serai en retard. Je suis arrivé à la gare. Le train. Déjà parti, je suis désolé, je t'attendrai. Allô, oui, Allô. Je serai en retard de quelques minutes. Quand je suis arrivé à la gare. Le train était déjà parti. Je suis désolé. Pas de souci, je t'attendrai au guichet. Qu'on doit Sophie nous faut que. Allô Sophie ? Oui, Allô ? Je serai en retard de quelques minutes. Quand je suis arrivé à la gare. Le train était déjà parti. Je suis désolé. Pas de souci. Je t'attendrai au guichet. ','text') ;

php

1$user_id="kujira"; 2$memo="Sophie ? Oui, Allô, je serai en retard de quelques minutes. Quand je suis arrivé à la gare. Le train était déjà parti. Je suis désolé, pas de souci, je t'attendrai au guichet. Je serai en retard. Je suis arrivé à la gare. Le train. Déjà parti, je suis désolé, je t'attendrai. Allô, oui, Allô. Je serai en retard de quelques minutes. Quand je suis arrivé à la gare. Le train était déjà parti. Je suis désolé. Pas de souci, je t'attendrai au guichet. Qu'on doit Sophie nous faut que. Allô Sophie ? Oui, Allô ? Je serai en retard de quelques minutes. Quand je suis arrivé à la gare. Le train était déjà parti. Je suis désolé. Pas de souci. Je t'attendrai au guichet. "; 3$datatype="text"; 4 5$sql1="INSERT INTO `memo` ( `user_id` , `memo` , `datatype`) VALUES ('".$user_id."','".$memo." ','".$datatype."') ;";

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

とりあえず。’  を ^ に置き換えて動かしました。

補足

MySQLサーバのバージョン: 5.5.62-log
フィールド 種別 照合順序       属性 ヌル(NULL) デフォルト値
memo text utf8_general_ci いいえ None

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

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

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

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

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

hawawa

2024/03/27 03:07

エスケープについて調べてみてはどうでしょうか
4351kujira

2024/03/27 05:25

エスケープというと、” とか ’ に ¥をつけるやつでしょうか? 確かに、フランス語の場合に、別のルーチンに分岐し、 そこで、  ’  を検出して、 エスケープするというのはアリだと思うのですが、 質問が不正確でしたね。 昔、UTF8 がなかった時(あったかもしれませんが私は知りませんでした)、 日本語の単語で、プログラムに不具合が出る時があったのですが それに対処するようなイメージでしょうか? フランス語圏のプログラマーはフランス語を今の日本語に対するUFT8みたいな使い方の 方法があれば知りたいという意味です。 すみません。専門用語を学ぶ機会がなかったもですから。
4351kujira

2024/03/27 06:01

回答ありがとうございます。 質問が稚拙で情報不足だったことに気づきました。
guest

回答3

0

phpMyAdminで手動で生データを投入となると無条件に流し込みはできません

SQL

1insert into tbl values('abc\'def');

のような変換をかけて入れるのが一般的です
プログラムで処理するならプレースホルダーを利用すると余計なエスケープを気にする必要はありません

投稿2024/03/27 01:33

yambejp

総合スコア114915

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

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

4351kujira

2024/03/27 05:29

プレースホルダーというものの存在がわかりません。 <input type=text name=namae placeholder=yamada> などで使うplaceholderとは別のもののような気がしますが・・・
yambejp

2024/03/27 05:52

> プレースホルダー SQLにおけるプレースホルダーは代理文字を設定しておき、内部処理をおこなうことでエスケープなどの余計な処理をしないで済む技法で、PHPでいうとPDOのprepare処理などが有名です。 たとえば「insert into tbl value(?,?),(?,?),(?,?)」のようなSQL文にそれぞれ投入したいデータを指定して投入します。(やり方はいくつかある)、PHPでSQL制御するにあたっては避けて通れない機能なのでこれを機に学習してみてください
4351kujira

2024/03/27 05:59

回答ありがとうございます。 勉強します。 ベストアンサーは別の方を選ばせていただきましたが、こちらの回答も非常に参考になりました。
guest

0

プログラムから直にSQL分に突っ込むのはそもそもSQLインジェクションの脆弱性があるので、
パラメータにしてバインドすれば特殊文字列については適切にエスケープしてくれます。

PHPマニュアル:
https://www.php.net/manual/ja/pdo.prepare.php

参考記事:
https://qiita.com/mpyw/items/b00b72c5c95aac573b71#select--from-users-where-id--id-%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%A4%89%E6%95%B0%E5%B1%95%E9%96%8B%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6sql%E6%96%87%E3%82%92%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E3%81%A6%E3%81%84%E3%82%8B

投稿2024/03/27 07:03

m.ts10806

総合スコア80854

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

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

m.ts10806

2024/03/27 07:04

あぁすでに同種の回答がついてた。
4351kujira

2024/03/28 03:50

ご親切なアドバイスありがとうございます。 なんとか、理解できるようになりたいと思います。
m.ts10806

2024/04/01 02:26

PHPでプログラムを書いていくのでしたら、PHPマニュアルを活用できるようになることが第一だと思っています。ヒントはその辺の記事でもいいですが、正確な情報はPHPマニュアルで、辞書としても使えます。 がんばってください。
guest

0

特殊な記号である(,)を文字列引用符(')内に含んでいる為、エラーとなっています。
文字列引用符を現在の(')から(")に変更してみて下さい。

SQL

1INSERT INTO `memo` ( `user_id`, `memo`, `datatype`) VALUES ( 2 "kujira","Allô Sophie ? Oui, Allô, je ~(略)~ ","text" 3)

若しくは\,のようにエスケープして下さい。
9.1.1 文字列リテラル

文字列は、一重引用符 (') または二重引用符 (") 文字で囲まれた一連のバイトまたは文字です。
表 9.1 特殊文字エスケープシーケンス

投稿2024/03/27 01:25

編集2024/03/27 02:26
sazi

総合スコア25206

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

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

4351kujira

2024/03/27 05:57 編集

あなたのアドバイスで、質問に足りないものがあることに気づきphpを追加修正しました。 アドバイス通りすると、 $sql1="INSERT INTO `memo` ( `user_id` , `memo` , `datatype`) VALUES ('".$user_id."','".$memo." ','".$datatype."') ;"; の(')と(")を真逆にするのでしょうか? やってみます。
4351kujira

2024/03/27 05:56

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
sazi

2024/03/27 07:32 編集

ベストアンサーになっていないので、質問が解決済みになっていません。 尚、他の方が言われているようにプレースフォルダを使用する方が良いかと思いますので検討として下さい。
ikedas

2024/03/27 12:03

MySQLでも “…” はANSIモードでは文字列の引用符ではないはずです。
sazi

2024/03/27 13:53 編集

ikedasさん > 引用しているリファレンス中に、 > ANSI_QUOTES SQLモードを有効にしている場合は、二重引用符で囲んだ文字列は識別子として解釈されるため、文字列リテラルを囲む引用符には単一引用符だけを使用できます。 とありますので、デフォルトのANSIモードでは(")は文字列の引用符として解釈されるのかと思います。 ただ、引用符を変更する事を解決策として回答したのは、適当ではないので、プレースフォルダの利用を含めエスケープするのが適当だと思っています。
ikedas

2024/03/28 11:58

はい、そういう意図でのコメントです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問