-1

このSQLクエリがあり、更新する前の関数の「created」という名前のフィールドにタイムスタンプを追加する必要があります。$sqlMod = sprintf("UPDATE %s SET last_modified=now(), %s WHERE id='%s'", $table, $implodeArray, $_POST['id']);うまく機能するものを追加しました。ただし、関数への挿入でその構文を正しく機能させることができないようです。私は試しました(created, %s) VALUES ("now(), %s")...そしてそれは動作しません。

$sql = sprintf('INSERT INTO %s (%s) VALUES ("%s")', $table, implode(', ', array_map('mysql_escape_string', array_keys($values))), implode('",  "',array_map('mysql_escape_string', $values)));

現在:INSERT INTO projects (created, project_name, project_bold, project_content, id) VALUES ("now(), something", "something", "something", "46919705")

4

3 に答える 3

1

の呼び出しNOW()は引用符で囲むべきではありませんが、それに続く引数は引用符で囲む必要があります。

(created, %s) VALUES (now(), "%s")

使用しないでくださいmysql_escape_string()mysql_real_escape_string()代わりに、より包括的なものを使用してください。長期的には、MySQLiやPDOなどのプリペアドステートメントをサポートするAPIに切り替えることを検討してください。ただし、実行しているような動的SQLのテーブル名を連結する必要があります。

MySQLは二重引用符をサポートしていますが、文字列値の単一引用符はもう少し標準的です。文字列の引用符を入れ替えてimplode()呼び出すと、最終的な製品は次のようになります。

$sql = sprintf("INSERT INTO %s (created, %s) VALUES (NOW(), '%s')", $table, implode(', ', array_map('mysql_real_escape_string', array_keys($values))), implode("',  '",array_map('mysql_real_escape_string', $values)));

あなたと将来の読者のためのセキュリティの最後のポイントとして、の起源はわかりません$tableが、それが何らかのユーザー入力に由来する場合は、受け入れ可能なテーブル名のホワイトリストに対してその値を確認することをお勧めします。によって適切に保護されmysql_real_escape_string()ます。

于 2012-07-04T01:24:26.297 に答える
0

すべての引数を単一の文字列に入れているようです。各引数は個別のエンティティである必要があるため、機能しません。

おそらくTIMESTAMP DEFAULT CURRENT_TIMESTAMP代わりに使用して、データベースに作成時間を入れさせることができます。

于 2012-07-04T01:19:51.987 に答える
0

created配列から削除し$values、SQL文字列にハードコーディングします。

$sql = sprintf('INSERT INTO %s (%s, created) VALUES ("%s", now())', $table, implode(', ', array_map('mysql_escape_string', array_keys($values))), implode('",  "',array_map('mysql_escape_string', $values)));
于 2012-07-04T01:24:31.297 に答える