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

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

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

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

解決済

気づけばプロ並みPHP

xo_yo
xo_yo

総合スコア54

PHP

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

2回答

0評価

1クリップ

1046閲覧

投稿2022/01/05 19:22

編集2022/01/17 16:52

php

<?php session_start(); session_regenerate_id(true); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <?php require_once('../common/common.php'); $post=sanitize($_POST); try{ $onamae=$post['onamae']; $email=$post['email']; $postal1=$post['postal1']; $postal2=$post['postal2']; $address=$post['address']; $tel=$post['tel']; echo $onamae.'様<br/>'; echo'ご注文ありがとうございました。<br/>'; echo$email.' にメールを送りましたのでご確認ください。<br/>'; echo'商品は以下の住所に発送させていただきます。<br/>'; echo $postal1.'-'.$postal2.'<br/>'; echo $address.'<br/>'; echo $tel.'<br/>'; $honbun=''; $honbun.=$onamae."様\n\nこの度はご注文ありがとうございました。\n"; $honbun.="\n"; $honbun.="ご注文内容\n"; $honbun.="----------\n"; $cart=$_SESSION['cart']; $kazu=$_SESSION['kazu']; $max=count($kazu); $dsn='mysql:dbname=shop;host=localhost;charset=utf8'; $user='root'; $password=''; $dbh=new PDO($dsn,$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); for($i=0;$i<$max;$i++){ $sql='SELECT name,price FROM mst_product WHERE code=?'; $stmt=$dbh->prepare($sql); $data=[]; $data[]=$cart[$i]; $stmt->execute($data); $rec=$stmt->fetch(PDO::FETCH_ASSOC); $name=$rec['name']; $price=$rec['price']; $kakaku[]=$price; $suryo=$kazu[$i]; $shokei=$price*$suryo; $honbun.=$name.''; $honbun.=$price.'円×'; $honbun.=$suryo.'個='; $honbun.=$shokei."円\n"; } $sql='LOCK TABLES dat_sales WRITE,dat_sales_product WRITE'; $stmt=$dbh->prepare($sql); $stmt->execute(); $sql='INSERT INTO dat_sales(code_member,name,email,postal1,postal2,address,tel) VALUES(?,?,?,?,?,?,?)'; $stmt=$dbh->prepare($sql); $data=array(); $data[]=0; $data[]=$onamae; $data[]=$email; $data[]=$postal1; $data[]=$postal2; $data[]=$address; $data[]=$tel; $stmt->execute($data); $sql='SELECT LAST_INSERT_ID()'; $stmt=$dbh->prepare($sql); $stmt->execute(); $rec=$stmt->fetch(PDO::FETCH_ASSOC); $lastcode=$rec['LAST_INSERT_ID()']; for($i=0;$i<$max;$i++){ $sql='INSERT INTO dat_sales_product(code_sales,code_product,price,quantity) VALUES(?,?,?,?)'; $stmt=$dbh->prepare($sql); $data=array(); $data[]=$lastcode; $data[]=$cart[$i]; $data[]=$kakaku[$i]; $data[]=$kazu[$i]; $stmt->execute($data); } $sql='UNLOCK TABLES'; $stmt=$dbh->prepare($sql); $stmt->execute(); $dbh=null; $honbun.="送料は無料です。\n"; $honbun.="-------------"; $honbun.="\n"; $honbun.="代金は以下の口座にお振り込みください\n"; $honbun.="銀行 00000\n"; $honbun.="入金確認が取れ次第、発送させていただきます。\n"; $honbun.="〜安心野菜ろくまる園〜\n"; $honbun.="\n"; $honbun.="東京都123-4\n"; $honbun.="電話:000-4444-3333\n"; $honbun.="メール:info@inini.com\n"; //echo'<br/>'; //echo nl2br($honbun); //↓メールを送信するシステム  p248 お客側のメール $title='ご注文ありがとうございます'; $header='From:info@inini.com';//送信元 $honbun=html_entity_decode($honbun,ENT_QUOTES,'UTF-8'); mb_language('japanese'); mb_internal_encoding('UTF-8');//mb_language('japanese');mb_internal_encodingこの形のまま覚える mb_send_mail($email,$title,$honbun,$header); //mb_send_mail(宛先, 件名, メッセージ, ヘッダ):https://techplay.jp/column/550 //↓メールを送信するシステム  p248 お店側のメール $headerに注目 $title='お客様からご注文がありました。'; $header='From:'.$email; $honbun=html_entity_decode($honbun,ENT_QUOTES,'UTF-8'); mb_language('japanese'); mb_internal_encoding('UTF-8');//mb_language('japanese');mb_internal_encodingこの形のまま覚える mb_send_mail('info@inini.com',$title,$honbun,$header); //mb_send_mail(宛先, 件名, メッセージ, ヘッダ):https://techplay.jp/column/550 }catch(PDOException $e){ exit($e->getMessage()); } ?> </body> </html>

「SQLSTATE[42000]: Syntax error or access violation: 1044」というエラーについて質問です。

sql

$sql='LOCK TABLES dat_sales WRITE,dat_sales_product WRITE'; $stmt=$dbh->prepare($sql); $stmt->execute(); _____________ $sql='UNLOCK TABLES'; $stmt=$dbh->prepare($sql); $stmt->execute();

上記のコードを」書く前は正常にデータがDBに入っていたのですが、上記のコードを書いてから実行しようとすると「SQLSTATE[42000]: Syntax error or access violation: 1044」このようなエラーが出ます。

エラーの内容は、「権限を持っていない」ということだとわかりましたが、なぜ上記のコードを書く前は正常に機能したのに、上記のコードを書いた途端にエラーが出るのでしょうか?

また、いろいろ試しましたが効果がありませんでした。解決のヒントをご教授願います。

________________________________________________
試したこと
https://qiita.com/mako0104/items/63784abab061e587d6c5
こちらの記事を参考にしてみましたが、うまくいきませんでした。

上記の記事を参考にしたところ「zsh: no matches found:」ここのようになり、「https://qiita.com/nisaji/items/f9eede2164a74bc08db7」この記事を参考にしましたが、うまくいきませんでした。

他にも同じような質問あり、真似てみたのですが、解決できませんでした。皆様のお力を借りられたら幸いです。ご教授の方をよろしくお願いいたします。



良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

m.ts10806

2022/01/05 21:08

書籍だけをタイトルにされても要件は分かりません。 https://teratail.com/help/question-tips#questionTips3-1 また、書籍に関係した方も回答で「元々内容がよろしくない」と書かれています。(私もそのようにコメントしています) https://teratail.com/questions/376646#reply-509042 書籍を変えるのを強くすすめます。可能ならPHPマニュアルを主動とした学習を。記事だけ真似ても、根本的な理解(基礎)がないと進まないと思います。
xo_yo

2022/01/05 21:18

書籍だけをタイトルにされても要件は分かりません。 ->申し訳ございません。 書籍に関係した方も回答で「元々内容がよろしくない」と書かれています。 ->そのコメントは幾度も目にしたので、あまりよくない書籍なんだなとは理解しているつもりです。そのために、「安全なwebアプリケーションの作り方」という本を購入しました。後々勉強する予定です。 その上で、なぜ上記のような現象になるのかをご教授願うことは可能でしょうか?よろしくお願いいたします。
m.ts10806

2022/01/05 21:21

質問は編集できますのでまずはタイトルなど調整を。 >安全なwebアプリケーションの作り方 PHPに限らない内容だったと思いますので、「PHPを」となるとちょっと違ってくると思います。 もちろん、Webアプリケーションを作っていく上では必要な知識技術となりますので無駄ではなくむしろ有用ですが。
xo_yo

2022/01/05 21:26

編集しました。ご指摘ありがとうございます。 質問した解答になっていないと思いましたので、再度質問させていただきます。 なぜ、上記のような現象になるのかをご教授願うことは可能でしょうか?よろしくお願いいたします。
m.ts10806

2022/01/05 21:43

ちなみに、PHPのバージョンは幾つでしょうか。
m.ts10806

2022/01/05 21:47

LOCK TABLEが実行できないのではと思って 構文チェッカーで試したところ、 https://rakko.tools/tools/36/ エラー: This command is not supported in the prepared statement protocol yet が出たので調べたところ下記のような質問が出てきたのですが、 https://stackoverflow.com/questions/19965025/mysql-cant-lock-tables-when-using-prepared-statements 当方のPHP7.4では再現しませんでした。 本当にrootなら権限の問題はなさそうですし、、、 念のためユーザーの権限も調べてみてください。 MySQLにログインしてコマンド、もしくはphpMyAdminが入っているなら「ユーザアカウント」のタブから確認できます。
xo_yo

2022/01/05 21:48

バージョンは、7.4.21です。
m.ts10806

2022/01/05 21:53

lock tables / unlockのところ prepare→execute ではなくquery に書き換えてみてください。 https://www.php.net/manual/ja/pdo.query.php もしこれでも同じなら先のコメントに書いたように本当に権限がないのではと懸念。 書籍に書いてあった内容なら、権限について言及されてませんか? (何も言及ないのなら書籍としてはかなりの説明不足です)
xo_yo

2022/01/05 21:55

念のためユーザーの権限も調べてみてください。 ->そこは問題なさそうでした。ここま色々して頂いてありがとうございます。もう少し、コメントを待ちつつ自分でも色々と操作してみます。 朝早くから、ありがとうございました。
m.ts10806

2022/01/05 21:57 編集

>そこは問題なさそうでした どこをどのように確認したのか、結果も質問本文に提示してください(客観的に判断できる情報がないと「本当に問題ないか」誰にも判断できない)。
xo_yo

2022/01/05 22:07

$userと$passwordに自分の名前を入れたものと、元から入っているrootと''の二つあり、両方試しました。 「$sql='LOCK TABLES dat_sales WRITE,dat_sales_product WRITE'; $stmt=$dbh->prepare($sql); $stmt->execute()」このコードを入れる前は、しっかりとDBにデータを入れることができていたので、権限に問題はないと考えています。(自分の名前の$userと$passwordを使用しています) しかし、「SQLSTATE[42000]: Syntax error or access violation: 1044」このようなエラーが出てきて、解決できません。
m.ts10806

2022/01/05 22:29

あのですからPHPからの間接的な実行ではなく、DBの設定情報で確認を。PHPはあくまでMySQLを指定の権限で利用してるに過ぎません。指定のユーザーの権限の確認はできません。 ↓ MySQLにログインしてコマンド、もしくはphpMyAdminが入っているなら「ユーザアカウント」のタブから確認できます。
退会済みユーザー

退会済みユーザー

2022/01/06 00:36

「SET autocommit=0;」しないでLOCK TABLES文って使えるんでしょうか?

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

PHP

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