1

数えてコンマをチェックし、もう一度全体を調べましたが、このエラーの原因はまだわかりません。列名を指定したよりも多くの情報を入力しようとしているが、29 列と 29 の値があることを示しています。私が見ることができる欠落したコンマはありません。

誰かがこれを一瞥して、私が見逃しているものがあるかどうかを確認できますか?

$query = <<<EOD

insert into roster

 (conference, regtime, participanttype_id, category_id, title, 

  firstname, lastname, badgename, jobtitle, department, 

  organization, address1, address2, address3, city, 

  state, country, postal, email, phone, 

  fax, paytype, feedue, f01, yn01, 

  yn02, yn03, yn04, other) 

 values 

 ('event1023', now(), $sfund_partictype_id, $sfund_category_id, '$title', 

 '$firstname', '$lastname', '$badgename', '$jobtitle', '$deptname', 

 '$organization', '$address1', '$address2', '$address3', '$city', 

 '$state', '$country', '$postal', '$email', '$phone', 

 '$fax', '$paytype', $feedue, '$wedsession', '$yn01', 

 '$yn02', '$yn03', '$yn04', '$other')

  EOD;

ETA: 過去の私の投稿に対する批判から、そうすべきだと示唆されているので、このように間隔をあけました。ただし、私のコードではそうではありません。

ETA #2: ここに奇妙なことがあります。値は完全にデータベースに入ります。しかし、それでもこれを返します(また、EEK MY CODEが正確なエラーを示していることに気付きました。余談ですが、ライブになる前に修正します):

クエリに失敗しました:

insert into roster 

(conference, regtime, participanttype_id, category_id, title, 
firstname, lastname, badgename, jobtitle, department, 
organization, address1, address2, address3, city, 
state, country, postal, email, phone, 
fax, paytype, feedue, f01, yn01, 
yn02, yn03, yn04, other) 

values 

('event1023', now(), 3, 14, 'Ms',
'Jane','Smith','Jane Smith', 'Developer', 'my dept',
'my organization', 'my address', '','','my city',
'NC','United States','55555','me@email.edu','555-555-5555',
'', 'CHECK', 225, '2', '1',
'0', '1', '0', 'n/a')

Column count doesn't match value count at row 1

4

4 に答える 4

2

この問題は、ほぼ確実に、変数のエスケープがないことが原因です。私が提案する2つのことがあります:

まず、単一引用符を含む可能性のあるものはすべて、エスケープ関数を介して実行されていることを確認するか、それを禁止して、それぞれを 2 倍にするだけです。ただし、誰かが値に正確に「、」を持たなければならないので、それがあなたの問題につながるとは思いません。

$feedue にコンマが含まれている場合は、より可能性が高くなります。それは値を2つの数値に分割するので、それはまだ有効ですが、あなたが望むものではありません. DB は自動的に文字列を数値にキャストする必要があります (ただし、その逆はできません)。そのため、最も簡単な方法は、その値を引用符で囲むことです。

于 2012-06-19T13:27:36.573 に答える
1

文字列値のいずれかに ' (引用符) が含まれていることを確認しましたか? これはそれをケースします..

つまり、$postal の値に ' が含まれていた場合、これで終了し、新しい値、または O'Neil のような姓があると見なされます... など

言い換えれば... PDOで文字列値を検証します(とにかくこれを使用する必要がありますm ysql_/mysqli_ コマンドは古く、あらゆる種類の悪いコードや安全でないコードにつながる可能性があります)または少なくとも mysql_real_escape_string または単一引用符を確保するための方法値にありません:)

于 2012-06-19T13:22:40.090 に答える
0

元の答え:

クエリ テキストに「安全でない」文字列が含まれています。代入後、$query の内容を出力します。すると問題が見えてきます。

たとえば、次の場合の $query の内容を検討してください。

$title = "Courage','Fear";

mysql_real_escape_stringこの関数を使用して SQL インジェクションを回避することをお勧めします。


編集: OPから提供された詳細情報に基づく

OP は、SQL テキストで提供される文字列が適切にエスケープされていることを報告し、OP は生成されたクエリ テキストの例を提供します。

OPは、コードが実行された後、行がデータベースに挿入されていることが判明したと報告しています。したがって、例外をスローしているのはこのステートメントではないことを確信できます。それは何か他の声明でなければなりません。

OPは、テーブルに列を追加する前にこれが機能していたことも報告しています。

質問に追加した SQL テキストを考慮して、テストを実行しましたが、問題なく動作しました。

したがって、ここに表示されている INSERT ステートメントではなく、例外をスローしている OTHER ステートメントであると確信しています。AFTER INSERTこのテーブルにトリガーがありますか?

于 2012-06-19T13:27:55.643 に答える
0

今週の私の教訓: IT にチェックを入れて、よりグローバルなベースで何か他のことが起こっていないことを確認してください...コードが間違っていると思い込まないでください。

これを理解するのを手伝ってくれてありがとう.

于 2012-06-27T13:23:10.103 に答える