我正在开发和员工考勤门户,我想限制用户在特定日期进行一次输入。因此,该日期不能重复当前日期的出勤值。
require('../config1.php');
date_default_timezone_set('Asia/Kolkata');
$Username=$_SESSION['sess_user'];
$Ptype= mysqli_escape_string($con, $_POST['ptype']);
$Time = time();
$TimeIN = date('Y-m-d H:i:s',$Time);
$Date = CURDATE('');
$Day = date('N');
mysqli_query($con, "INSERT INTO presence(pid,username,ptype,timein,date,pday)
VALUES (NULL,'$Username','$Ptype','$TimeIN','$Date','$Day')")
or die(mysqli_error($con));
因此,使用我当前的代码,一个用户可以在同一天进行多次输入。
您可以使用INSERT IGNORE INTO
查询来实现您的目标。如果行不存在,它将插入该行,如果该行已存在,则仅忽略查询。因此,如果该人已经标记了出勤情况,那么下一次尝试将被简单地忽略。您可以参考此链接了解更多详情:http://bogdan.org.ua/2007/10/18/mysql-insert-if-not-exists-syntax.html
例:
"INSERT IGNORE INTO 'presence'
SET 'pid'=NULL,
'username' =$Username,
'ptype' = $Ptype,
'timein' = $TimeIN,
'date' = $Date,
'pday' = $Day;
有几种方法可以解决这个问题。
在PHP中:首先,您可以在插入之前检查表中没有具有相同用户名和日期presence
行,然后决定是否插入您的数据。
require('../config1.php');
date_default_timezone_set('Asia/Kolkata');
$Username=$_SESSION['sess_user'];
$Ptype= mysqli_escape_string($con, $_POST['ptype']);
$Time = time();
$TimeIN = date('Y-m-d H:i:s',$Time);
$Date = CURDATE('');
$Day = date('N');
$req_pre = mysqli_prepare($bdd, 'select pid from presence where username=? and date=?');
mysqli_stmt_bind_param($req_pre, $Username, $Date);
//If the row is there, then your user has already registered, else he hasn't.
mysqli_query($con, "INSERT INTO presence(pid,username,ptype,timein,date,pday) VALUES (NULL,'$Username','$Ptype','$TimeIN','$Date','$Day')") or die(mysqli_error($con));
}
在 PHP 和 SQL 中:我不知道你的sgbd,所以你必须确定解决方案的确切语法。我不知道您是如何设置唯一索引的,但是您可以让多列定义唯一索引,从而确保 sql 表中一次只有一行。例如,在 mysql 中,它将是
ALTER TABLE `presence` ADD UNIQUE `unique_index`(`username`, `date`);
仅此而已吗?不是真的,如果您使用相同的$username将用户添加到表中,并且$date那么您的 php 将返回错误。Mysqli 不会自然地发送抛出错误,因此您必须手动处理它们(构建一个系统来抛出它们)。这是一个转机。
require('../config1.php');
date_default_timezone_set('Asia/Kolkata');
$Username=$_SESSION['sess_user'];
$Ptype= mysqli_escape_string($con, $_POST['ptype']);
$Time = time();
$TimeIN = date('Y-m-d H:i:s',$Time);
$Date = CURDATE('');
$Day = date('N');
mysqli_query($con, "INSERT INTO presence(pid,username,ptype,timein,date,pday)
VALUES (NULL,'$Username','$Ptype','$TimeIN','$Date','$Day')");
if (mysqli_errno == 1062) {
//There it is a duplicate entry
print 'no way!';
}
请注意,它只会捕获"重复"错误,而不会捕获其他错误。
我希望这对你有帮助
你可以让INSERT
语句进行测试。请注意,您可以跳过 pid 列,因为无论如何都会传递 null:
INSERT INTO presence(username, ptype, timein, `date`, pday)
SELECT '$Username', '$Ptype', '$TimeIN', '$Date', '$Day'
FROM dual
WHERE ('$Username', '$Date') NOT IN
(SELECT username, `date`
FROM presence)
请注意,FROM dual
只是因为语法需要 FROM
子句。此外,由于日期是一个保留词,您最好将其放在反引号周围。
如果在 ptype 不同时允许多条记录,则将该列添加到 WHERE
子句和子查询中。
然后在 PHP 代码中,您可以检查是否插入了一行:
if (mysqli_affected_rows($con) == 0) {
// duplicate detected. No insert done.
echo "You cannot enter another presence for the same day";
}
另类
如果一般规则(也可能在其他代码中)不允许此类重复项存在于表中,则应在数据库级别定义它,如下所示:
ALTER TABLE presence
ADD UNIQUE INDEX idx_username_date (username, `date`);
在执行上述操作之前,您必须确保表中已经没有此类重复项,否则语句会抱怨这一点。
然后在代码中检查是否有任何错误并报告它们:
$result = mysqli_query($con,
"INSERT INTO presence(username, ptype, timein, `date`, pday)
VALUES ('$Username', '$Ptype', '$TimeIN', '$Date', '$Day')");
if (!$result) {
// INSERT did not happen.
if (mysqli_errno($con) == 1062) { // Duplicate entry
// Treat duplicate
echo "You cannot enter another presence for the same day";
} else {
// another error occurred: report it and exit.
echo mysqli_errno($con) . " - " . mysqli_error($con)
exit();
}
}
是否要在显示"重复"消息后也退出,取决于您是否仍要执行其余代码。