2

全て、

自動インクリメント ID と 2 つのデータ フィールドの 3 つのフィールドを持つテーブルを作成しました。データの 2 つのフィールドは外部キーであり、誤って に設定しましたNON NULL。次に、次の PHP コードを実行します。

$inserted=false;
$insertQuery=$dbConnection->prepare("INSERT INTO $this->table () VALUES ()");
$inserted=$insertQuery->execute(); //Should be true if succesful, False if not.
echo $inserted;
exit;

それは a 1- を表示するので、の値は$insertedですtrue。この変数をコントロールとして使用して、クエリが正常に実行されたことを確認します。

ただし、データベースを確認すると、クエリは実行されていません。手動で入力すると、2 つのデータ フィールドで値が許可されないため、エラーが発生しnullます。

私の質問は次のとおりです。挿入がエラーになったのに、コードでの値が$inserted切り替わるのはなぜですか?true

PS: phpMyAdmin でクエリを手動で実行するには、次のようにします
INSERT INTO 'flashcards' () VALUES ()
:
#1452 - Cannot add or update a child row: a foreign key constraint fails ('project'.'table1', CONSTRAINT 'table1_ibfk_1' FOREIGN KEY ('data1') REFERENCES 'table2' ('data2') ON DELETE NO ACTION ON UPDATE NO ACTION)

PPS: 以下に示す vardump コードを追加すると:

var_dump("Result: ", $inserted);
var_dump("Affected: ", $insertQuery->rowCount());
var_dump("Warnings: ", $insertQuery->errorInfo());

次に、次のようになります。

string 'Result: ' (length=8)
boolean true
string 'Affected: ' (length=10)
int 1
string 'Warnings: ' (length=10)
array
  0 => string '00000' (length=5)
  1 => null
  2 => null
4

1 に答える 1

2

テストを実行したところ、次のことがわかりました。

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(11) NOT NULL,
  `email` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

コンソールから:

INSERT INTO `test` () VALUES ();

// Result:

1 row(s) affected, 2 warning(s):
1364 Field 'name' doesn't have a default value
1364 Field 'email' doesn't have a default value

次に、次を選択します。

mysql> select * from test;
+----+------+-------+
| id | name | email |
+----+------+-------+
|  1 |    0 |       |
+----+------+-------+
1 row in set (0.00 sec)

別の挿入テスト:

mysql> INSERT INTO `test` () VALUES(NULL, NULL, NULL);
ERROR 1048 (23000): Column 'name' cannot be null

そのため、パラメータをバインドせず、値を設定しない場合、何らかの理由で MySQL は欠落している値を として処理しないようNULLです。デフォルト値が設定されていない場合でも、データが挿入されるのは興味深いことです (したがって、デフォルトは列の型に固有になります)。

ポイントをさらに説明するためのいくつかのPHPコード:

$pdo = new PDO('mysql:host=10.1.1.37;dbname=testing', 'user', 'pw');

$query = $pdo->prepare("INSERT INTO `test` () VALUES ()");

$result = $query->execute();

var_dump("Result: ", $result);

var_dump("Affected: ", $query->rowCount());

var_dump("Warnings: ", $query->errorInfo());

/*
string(8) "Result: "
bool(true)
string(10) "Affected: "
int(1)
string(10) "Warnings: "
array(3) {
  [0]=>
  string(5) "00000"
  [1]=>
  NULL
  [2]=>
  NULL
}
*/

したがって、成功した結果が得られる理由はexecute()、データがテーブルに挿入されていると推測するためです。そこには何も見えなかったのですか?物事を解決するのに役立つことを願っています。

于 2012-07-26T23:18:10.717 に答える