Php 选择date=NOW()所在的行?
我试图创建一个表,根据日期和用户id记录步骤。但当我运行代码时,如果用户每天多次记录步骤,我会得到重复的行。我不能有一个具有唯一密钥的日期,因为如果任何其他用户在同一天记录了步骤,这将导致所有其他用户无法记录步骤。因此,我的观点是,我想删除用户id和日期相同的重复行的选项。我有两张桌子 表a和表b,我将它们称为某物 使用Php 选择date=NOW()所在的行?,php,mysql,sql,database,select,Php,Mysql,Sql,Database,Select,我试图创建一个表,根据日期和用户id记录步骤。但当我运行代码时,如果用户每天多次记录步骤,我会得到重复的行。我不能有一个具有唯一密钥的日期,因为如果任何其他用户在同一天记录了步骤,这将导致所有其他用户无法记录步骤。因此,我的观点是,我想删除用户id和日期相同的重复行的选项。我有两张桌子 表a和表b,我将它们称为某物 使用$entry=“SELECT*FROM table.a WHERE userid.a='$user\u id.b'和date=NOW()“ 我想用它作为一个条件来决定UPDATE
$entry=“SELECT*FROM table.a WHERE userid.a='$user\u id.b'和date=NOW()“
我想用它作为一个条件来决定UPDATE
或INSERT到
表中。我从以前的一个查询中得到了user\u id.b
,该查询按原样工作,因此我将暂时保持原样
以下是我查询数据库的方式:
$entry_result = mysqli_query($conn, $entry);
这里使用的是:
if (mysqli_num_rows($entry_result) > 0){
$conn->query("UPDATE steplogger SET steps='$steps' WHERE userid='$user_id' AND date=NOW()");
} else {
$conn->query("UPDATE users SET totalsteps = totalsteps + ('$steps') WHERE username = '$user'");
$conn->query("INSERT INTO steplogger (steps, userid, date) VALUES ('$steps', '$user_id', NOW())");
}
有没有想过我做错了什么
注:当我回显$entry\u结果时
我得到一个mysqli对象。正如你所说:
我想删除在用户id和日期之间有重复行的选项
最好的方法是在user\u id
和date
上创建一个唯一索引,这样您就无法插入两行具有相同user\u id
和date
的数据
有了一个唯一的索引,您可以使用INSERT…ON DUPLICATE KEY UPDATE
执行您想要的操作:您将插入一个新行(newuser\u id
+date
),如果已经存在一个具有相同user\u id
和date
的行,您将更新该行
以下是文档:您可以这样尝试
if (mysqli_num_rows($entry_result) > 0){
$conn->query("UPDATE steplogger SET steps='$steps' WHERE userid='$user_id' AND date=".NOW().")";
} else {
$conn->query("UPDATE users SET totalsteps = totalsteps + ('$steps') WHERE username = '$user'");
$conn->query("INSERT INTO steplogger (steps, userid, date) VALUES ('$steps', '$user_id', ".NOW()."))";
}
要在NOW()函数中获取当前日期,可以使用以下命令。
而且这两个条件的格式也应该相同。如果执行
SELECT NOW()
你会看到它返回类似2018-10-25 14:42:55
,你确定要=
加秒吗?MySQL NOW()函数以“YYYY-MM-DD HH:MM:DD”或“yyyyymmddhhmmss.uuuuuuu”格式中的字符串或数字形式返回配置时区中的当前日期和时间。您可以检查CURDATE()
是否更适合您。警告:使用mysqli
时,您应该使用并将用户数据添加到查询中。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。切勿将$\u POST
、$\u GET
或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。注意:mysqli
的面向对象界面明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql\u查询
接口混淆。在你对程序性风格投入太多之前,值得换一种。示例:$db=new mysqli(…)
和$db->prepare(“…”)
过程接口是PHP 4时代的产物,当时引入了mysqli
API,不应该在新代码中使用。这导致了我担心的结果。我想我在描述我的问题时不够清楚,但问题在于这种类型的解决方案,如果随机用户登录了一些步骤,比如说2018年10月27日,那么在用户id
和日期上都有唯一索引
,其他用户不允许在同一日期记录步骤。这有助于理解我的问题吗?那么你说的是,当随机用户登录到你的数据库时,你有一个通用的user\u id
?如果user\u id
是唯一的(它应该是唯一的),那么user\u id
+date
上的唯一索引将起作用,我将按照您所说的那样在user\u id+date上使用唯一索引来修复它。谢谢我要把这个答案标为正确答案。