teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2019/02/14 03:24

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -52,6 +52,8 @@
52
52
  }
53
53
  echo "<hr>";
54
54
 
55
+ //mts10806 変数名や関数名にマジックナンバーは厳禁。何を保管しているものか、何をするものかわからない。prepareの返りはstatementなのでsqlという変数名もナンセンスです。
56
+
55
57
  $sql3 = $pdo->prepare("INSERT INTO mission_4_1(id,name,comment,time,pass) VALUES(:id,:name,:comment,:time,:pass)");
56
58
  //mts10806 auto_increment設定しているならinsertにidは基本不要
57
59
  $sql3->bindParam(':name', $name, PDO::PARAM_STR);
@@ -85,6 +87,7 @@
85
87
  }
86
88
  }
87
89
  } elseif (! empty($pass2)) {
90
+ //mts10806 なんでこの前までbindしてきてるのになぜここでやらない・・
88
91
  $sql8 = "SELECT*FROM mission_4_1 WHERE id=$deleted";
89
92
  $stmt = $pdo->query($sql8);
90
93
  foreach ($stmt as $row) {

1

追記

2019/02/14 03:24

投稿

m.ts10806
m.ts10806

スコア80888

answer CHANGED
@@ -4,4 +4,110 @@
4
4
  ちなみに本日、同じエラーで質問投稿された方もいました。
5
5
  - [teratail:PHPを使ってテーブルを作成したい](https://teratail.com/questions/174310)
6
6
 
7
- 原因は全く一緒ではないにしろ、原因の探し方は同じだと思います。
7
+ 原因は全く一緒ではないにしろ、原因の探し方は同じだと思います。
8
+
9
+ ------
10
+
11
+ コメントしたとおり、提示コードでは同エラーは起きません。
12
+ ただ、インデントがかなり荒れていて読みづらいので、整理したうえで、気になるところをコメントしてみました。
13
+ ```php
14
+ <?php
15
+ $named=$_POST['content'];
16
+ $commented=$_POST['content2'];
17
+ $deleted=$_POST['number'];
18
+ $edited=$_POST['edit'];
19
+ $editnumber=$_POST['content3']; //mts10806 取得してるけどどこにも使ってない
20
+ $passed=$_POST['pass'];
21
+ $pass2=$_POST['pass2'];
22
+ $pass3=$_POST['pass3'];
23
+ $timed = date('Y/n/d H:i:s');
24
+ // データベース接続
25
+ $dsn = 'mysql:dbname=test;host=localhost';
26
+ $user = 'root';
27
+ $password = '';
28
+ $pdo = new PDO($dsn, $user, $password, array(
29
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
30
+ ));
31
+
32
+ //mts10806 DBに関する処理を行うときはきちんとtry-catchしてException(今回はPDOException)を捕捉するようにしましょう
33
+
34
+ // テーブル作成
35
+ $sql = "CREATE TABLE IF NOT EXISTS mission_4_1" . "(" . "id INT auto_increment," . "name char(32)," . "comment TEXT," . "time DATETIME," . "pass INT," . "primary key(id)" . ");";
36
+ $stmt = $pdo->query($sql);
37
+
38
+ // テーブル作成確認
39
+ $sql1 = 'SHOW TABLES';
40
+ $result = $pdo->query($sql1);
41
+ foreach ($result as $row) {
42
+ echo $row[0];
43
+ echo '<br>';
44
+ }
45
+ echo "<hr>";
46
+
47
+ // テーブル 中身 確認
48
+ $sql2 = 'SHOW CREATE TABLE mission_4_1';
49
+ $result = $pdo->query($sql2);
50
+ foreach ($result as $row1) {
51
+ echo $row1[1];
52
+ }
53
+ echo "<hr>";
54
+
55
+ $sql3 = $pdo->prepare("INSERT INTO mission_4_1(id,name,comment,time,pass) VALUES(:id,:name,:comment,:time,:pass)");
56
+ //mts10806 auto_increment設定しているならinsertにidは基本不要
57
+ $sql3->bindParam(':name', $name, PDO::PARAM_STR);
58
+ $sql3->bindParam(':comment', $comment, PDO::PARAM_STR);
59
+ $sql3->bindValue(':time', $time, PDO::PARAM_STR);
60
+ $sql3->bindValue(':pass', $pass, PDO::PARAM_INT);
61
+ //mts10806 どっちかに統一を。bindValueの方がのぞましい。
62
+
63
+ $name = $named; //mts10806 ここで定義してもbindParam,BindValueで使うことにはならない
64
+ $comment = $commented;
65
+ $time = $timed;
66
+ $pass = $passed;
67
+
68
+ $sql3->execute(); //mts10806 SQLで用意したパラメータとセットしたパラメータの数があわないのでエラーでますよ。
69
+
70
+ if (! empty($pass3)) {
71
+ $sql7 = "SELECT*FROM mission_4_1 WHERE id=$edited";
72
+ $stmt = $pdo->query($sql7);
73
+ foreach ($stmt as $row) {
74
+ if ($row['id'] == $edited and $row['pass'] == $pass3) {
75
+
76
+ $id = "$edited";
77
+ $name = "$named";
78
+ $comment = "$commented";
79
+ $sql4 = 'update mission_4_1 set name=:name,comment=:comment where id=:id';
80
+ $stmt = $pdo->prepare($sql4);
81
+ $stmt->bindParam(':name', $name, PDO::PARAM_STR);
82
+ $stmt->bindParam(':comment', $comment, PDO::PARAM_STR);
83
+ $stmt->bindParam(':id', $id, PDO::PARAM_INT);
84
+ $stmt->execute();
85
+ }
86
+ }
87
+ } elseif (! empty($pass2)) {
88
+ $sql8 = "SELECT*FROM mission_4_1 WHERE id=$deleted";
89
+ $stmt = $pdo->query($sql8);
90
+ foreach ($stmt as $row) {
91
+ if ($row['id'] == $deleted) {
92
+
93
+ $id = "$deleted";
94
+ $sql5 = 'delete from mission_4_1 where id=:id';
95
+ $stmt = $pdo->prepare($sql5);
96
+ $stmt->bindParam(':id', $id, PDO::PARAM_INT);
97
+ $stmt->execute();
98
+ }
99
+ }
100
+ }
101
+
102
+ $sql6 = 'SELECT*FROM mission_4_1';
103
+ $stmt = $pdo->query($sql6);
104
+ $results = $stmt->fetchAll();
105
+ foreach ($results as $row2) {
106
+ // $rowの中にはテーブルのカラム名が入る
107
+ echo $row2['id'] . ',';
108
+ echo $row2['name'] . ',';
109
+ echo $row2['comment'] . ',';
110
+ echo $row2['time'] . '<br>';
111
+ }
112
+ ?>
113
+ ```