-1

我有这个 sql 查询,我需要在之前更新的函数中为名为“created”的字段添加时间戳。我添加了$sqlMod = sprintf("UPDATE %s SET last_modified=now(), %s WHERE id='%s'", $table, $implodeArray, $_POST['id']);哪个效果很好。但是,我似乎无法在 insert into 函数中获得正确的语法以使其正常工作。我试过(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()。从长远来看,考虑切换到支持准备好的语句的 API,如 MySQLi 或 PDO,尽管您仍然需要在表名中连接动态 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

您似乎将所有参数放入一个字符串中 - 这不起作用,因为每个参数都需要是一个单独的实体。

您可能只使用 aTIMESTAMP 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 回答