0

テーブル内のすべてではないが一部のフィールドを指定するpdoを実行すると、一方のサーバーでは正常に挿入されますが、もう一方のサーバーでは挿入に失敗します。

たとえば、問題サーバーについて...

、、、および..の3つのフィールドを持つテーブルをid使用timeintervention

このステートメントを実行すると、期待どおりに挿入されます。

$query = "INSERT INTO data_agreements (`id`, `time`, `intervention`) VALUES (?, ?, ?)";
$q = $pdo->prepare($query);
$q->execute(array("x", "y", "z"));

しかし、次のステートメントを実行すると、挿入に失敗します。

$query = "INSERT INTO data_agreements (`id`, `time`) VALUES (?, ?)";
$q = $pdo->prepare($query);
$q->execute(array("x", "y"));

問題のあるサーバーは、MySql 5、PHP5.2.6を使用するIISです。MySql 5、PHP 5.2.6を搭載した別のサーバーApacheでは、両方のステートメントが期待どおりに挿入されます。したがって、テーブル内のフィールドのサブセットのみを指定するステートメントを受け入れるように問題のサーバーに設定する必要があるMySQLのインストール/設定があるかどうか疑問に思っています。?

ありがとう!

4

3 に答える 3

1

SQL ステートメントに構文上の問題はありません。MySQL サーバーには、この動作を制御する特定の「設定」はありませんが、特定の INSERT ステートメントが成功するかどうかに影響を与える設定がいくつかあります。たとえば、無効な日付 (つまり、存在しない日付) を許可する設定です。 6 月 31 日など)、ゼロ日付 (「0000-00-00」) を保存できる設定。(この動作はバージョン間で変更されており、「古い」(たとえば V3.23) デフォルトでは無効な日付が許可され、「新しい」(たとえば v5.1) デフォルトでは無効な日付が許可されません。)

バインド パラメータに指定された値が有効な場合、観察された動作の最も可能性の高い説明は、違反している (または違反する可能性がある) CONSTRAINT があることです。

これは、主キー制約、一意キー制約、外部キー制約、NOT NULL 制約、または例外をスローするトリガーである可能性があります。

たとえば、列介入が NOT NULL として定義され、デフォルト値が指定されていない場合があります。

MySQL エラー情報は、これをデバッグするのに役立つ場合があります。

別の可能性としては、このステートメントは実際には成功していますが、トランザクションのコンテキストで実行されており、トランザクションはその後コミットされずにロールバックされている可能性があります。)

あなたの質問には、伝えるのに十分な情報がありません。

2 つのデータベースのテーブル定義を比較することをお勧めします。(私にとって)最も簡単な方法はSHOW CREATE TABLE intervention、各データベースのステートメントからの出力を取得し、違いを探すことです。データベースの 1 つに BEFORE INSERT FOR EACH ROW トリガーがあり、他のデータベースには存在しない可能性もあります。

于 2012-08-08T14:25:24.917 に答える
0
INSERT INTO data_agreements 
  (id, time) 
VALUES 
  (?, ?) ;

この場合、他のフィールドが属性またはテーブルの作成時にintervention定義されている場合、正常に実行されます。そうでない場合は、ステートメントに値を明示的に指定する必要があります。DEFAULTAUTO_INCREMENTINSERT

SHOW CREATE TABLE data_agreements2 つのインストールで、テーブルがどのように定義されているかを確認してください。

テーブルのTIMESTAMP列には、明らかでない機能があります。それらの 1 つだけが属性を持つことができDEFAULT CURRENT_TIMESTAMPます (それを指定しない場合、テーブル内の最初の 1 つだけがこのデフォルトを取得します)。

この問題は、複数のタイムスタンプ列を持つ 1 つのテーブルを定義してから、最初の列を削除した場合に発生した可能性があります。

于 2012-08-08T14:01:22.373 に答える
0

列に値intervention を許可しないに違いありません。 null

テーブルを変更してみて、それが機能するかどうかを確認してください。

ALTER table data_agreements Modify intervention varchar(50) null DEFAULT '';

クエリを再度実行してみてください。これinterventionは文字列だと思いましたが、もちろん、必要に応じて変更できます。

ありがとう。

于 2012-08-08T14:38:57.037 に答える