我正在开发和员工考勤门户网站,我想限制用户为特定日期创建一个条目。 因此,当前日期的出勤率不会重复。
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));
因此,使用我当前的代码,一个用户可以在同一天进行多次输入。
答案 0 :(得分:0)
有几种方法可以解决这个问题。
在PHP中:
首先,您可以在插入之前检查表presence
中没有相同用户名和行的行。 date,然后决定是否插入数据。
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不会自然地发送throw错误,因此您必须手动处理它们(构建一个系统来抛出它们)。这是一个转机
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!';
}
请注意,它只会捕获“DUPLICATE”错误,而不会捕获其他错误。
我希望这会对你有所帮助
答案 1 :(得分:0)
您可以使用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;
答案 2 :(得分:0)
您可以让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
子句。另外,由于 date 是一个保留字,所以你最好在它周围添加反引号。
如果在 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();
}
}
在显示“重复”消息后是否还要退出取决于您是否仍想执行其余代码。