Php 重复事件检查中的SQL错误
我正在制作一个重复事件系统,必须硬编码检查一个事件是否已通过以创建一个新的事件。(不,我无法创建cron作业,因为系统基础是Windows,不,我没有访问任务计划程序的权限。) 这是我目前掌握的代码:Php 重复事件检查中的SQL错误,php,sql,Php,Sql,我正在制作一个重复事件系统,必须硬编码检查一个事件是否已通过以创建一个新的事件。(不,我无法创建cron作业,因为系统基础是Windows,不,我没有访问任务计划程序的权限。) 这是我目前掌握的代码: <?php require('common.php'); $query = "SELECT * FROM DD_events "; try{ $stmt = $db->prepare($query)
<?php
require('common.php');
$query = "SELECT
*
FROM
DD_events
";
try{
$stmt = $db->prepare($query);
$result = $stmt->execute();
}
catch(PDOException $ex){
die("Failed to run query: " . $ex->getMessage());
}
$chk = $stmt->fetchall();
//print_r($chk);
foreach ($chk as $chks) {
if (time() > $chks['event_date']) {
//Add 1 day to event time
$time = strtotime($chks['event_date']);
$newTime = $time + 86400; // 24 * 60 * 60
// Create query to make the next event
$query = "INSERT INTO
DD_events (event_name, event_date, initiator, min_lvl, max_level)
VALUES
({$chks['event_name']}, {$newTime}, 0, {$chks['min_lvl']}, {$chks['max_level']})
";
try
{
// These two statements run the query against your database table.
$stmt = $db->prepare($query);
$stmt->execute();
}
catch(PDOException $ex)
{
// Note: On a production website, you should not output $ex->getMessage().
// It may provide an attacker with helpful information about your code.
die("Failed to run query: " . $ex->getMessage());
}
}
}
假设event\u name
是VARCHAR
您需要将{$chks['event\u name']}
替换为{$chks['event\u name']}
。根据数据类型的不同,这可能也适用于event\u date
,您需要引用变量,但这会使您的查询容易受到sql注入的影响,因此正确的解决方案是使用绑定变量:
$query = "INSERT INTO
DD_events (event_name, event_date, initiator, min_lvl, max_level)
VALUES
(:event_name, :event_date, 0, :min_lvl, :max_level)
";
try
{
// These two statements run the query against your database table.
$stmt = $db->prepare($query);
$stmt->execute(array(':event_name' => $chks['event_name'],
':event_date' => $newTime,
':min_lvl' => $chks['min_lvl'],
':max_level' => $chks['max_level']));
}
也许做同样的事情更容易:
INSERT INTO DD_events
(event_name, event_date, initiator, min_lvl, max_level)
SELECT event_name, DATE_ADD(event_date, INTERVAL 1 DAY), 0, min_lvl, max_lvl
FROM DD_events
这将在一天后为每个现有事件创建一个新事件(这是您所说的代码应该做的),基本上不需要整个脚本为什么您的查询如此复杂?在我看来,值()中的每个字符串列都缺少单引号
list.@var\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。检查我的答案是否有效?肯定事件名称必须是某种VARCHAR?它需要被引用,或者更好,在这里为语句使用一个参数,避免这个问题。您正在准备和执行,但由于您仍在替换变量,因此没有任何好处。即使从另一行抓取并直接放回,是否有人会弹出?@Matt如果名称列包含'
或“
字符,则可能导致sql中断(取决于您引用的内容)。使用绑定变量是最好和最安全的方法。我在函数中实现了变量。感谢大家的提醒。我尝试了这个方法,它将日期插入为NULL
@Matt-你的意思是事件\u date
?这是数据库中的日期列吗?是的。它设置为DATETIME。@Matt-编辑了我的答案,忘了指定日期列,以便插入可能是问题所在。为什么会出现插入
,然后选择
?