我有这个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")
答案 0 :(得分: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()
充分保护。
答案 1 :(得分:0)
您似乎将所有参数放入一个字符串中 - 这不起作用,因为每个参数都需要是一个单独的实体。
您可能只需使用TIMESTAMP DEFAULT CURRENT_TIMESTAMP
,然后让数据库为您创建创建时间。
答案 2 :(得分: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)));