为了避免 Laravel 中的代码重复,我想要一个由多个控制器使用的方法,它在数据库中插入一些行并更新另一个表中的一些数据。
我想过使用 Repository,但我在某处读到 Repository 更适合用于检索数据,不应该用于插入。
所以我现在要使用 Traits。但我有点困惑...
有人可以简单地解释一下这些(存储库/服务/特征)中每一个的最佳用法是什么,它们有什么不同?
我在数据库中有一个唯一的列,名为 ip
BINARY(16)使用PHP函数将IP地址转换为IP地址(不排序规则)后,将其存储在此列中
$store_ip = inet_pton($ip);
Run Code Online (Sandbox Code Playgroud)
当我尝试两次插入相同的IP时,它可以正常工作并失败,因为它是唯一的,
但是,当我尝试选择IP时,它将不起作用,并且始终返回FALSE(未找到)
<?php
try {
$ip = inet_pton($_SERVER['REMOTE_ADDR']);
$stmt = $db->prepare("SELECT * FROM `votes` WHERE ip=?");
$stmt->execute([$ip]);
$get = $stmt->fetch();
if( ! $get){
echo 'Not found';
}else{
echo 'Found';
}
// close connection
$get = null;
$stmt = null;
} catch (PDOException $e) {
error_log($e->getMessage());
}
Run Code Online (Sandbox Code Playgroud)
我插入IP的部分:
<?php
if( ! filter_var($ip, FILTER_VALIDATE_IP)){
return FALSE;
}
$ip = inet_pton($_SERVER['REMOTE_ADDR']);
try {
$stmt = $db->prepare("INSERT INTO votes(ip, answer) VALUES(?,?)");
$stmt->execute([$ip, $answer]);
$stmt = null; …Run Code Online (Sandbox Code Playgroud) 我只是想在新的 Ubuntu 20.04 上安装 PHP 7.4,
做一个简单的apt install php php-cli安装默认7.4版本,
但是当我这样做时apt update && apt upgrade,版本仍然7.4.3不是7.4.5!
请注意,我知道这可以通过添加
ppa:ondrej/php存储库来解决。
我只是想了解,如果 Ubuntu 默认附带 7.4,为什么不更新到最新版本?即使在 2-3 年后,我们也会一直7.4.3使用 Ubuntu 20.04.0(不是下一个版本)吗?唯一的选择是添加ondrej/php存储库?
编辑:PHP 7.4.6 已于几周前发布,但我服务器上的版本仍停留在 7.4.3 上。
我看到每个人都建议使用一个变量,例如
$start_time = microtime(TRUE);
Run Code Online (Sandbox Code Playgroud)
在脚本的顶部,然后在最后一行我们做:
$process_time = microtime(TRUE) - $start_time;
Run Code Online (Sandbox Code Playgroud)
我的问题是,我们能否可靠地使用$_SERVER['REQUEST_TIME_FLOAT']和跳过 $start_time ?如果是这样,为什么每个人仍然建议在顶部使用 $start_time ?
我的意思的例子:
<?php
// No need for $start_time...
// All the stuff we do to have the benchmark at the end
// Only this line needed to display execution time
echo "Processed in: ". bcsub(microtime(TRUE), "{$_SERVER['REQUEST_TIME_FLOAT']}", 4);
?>
Run Code Online (Sandbox Code Playgroud) 我的数据库中有一列名为time。此列的类型为timestamp,默认值为CURRENT_TIMESTAMP
但是在一些插入之后,phpMyAdmin它在其中将值显示为datetime,例如2019-05-05 04:24:45,甚至在那里也显示了时区并且可以更改!
我以为MySQL的时间戳是4个字节(相比于datetime的8个字节),并且不存储时区,数据与INT(10)相同,例如:(1557094115自1970年以来经过的秒数或类似的东西)
谁能解释一下,是bug还是什么?
MySQL版本5.7.25
这是一TIMESTAMP列,默认值为CURRENT_TIMESTAMP

正如您所看到的那样DATETIME,我无法将它与unix_timestamp的整数值进行比较...也可以将TimeZone更改为任何值(我认为时间戳记不存储时区...)

如果(基于一个答案)MySQL在内部将其存储为整数,那么为什么不能将其与整数进行比较?(以下查询无效)
DELETE FROM `table` WHERE time < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL :days DAY))
Run Code Online (Sandbox Code Playgroud)
SQLSTATE [22007]:无效的日期时间格式:1292错误的日期时间值:第1行的“时间”列为“ 1555980012”
我也在Sequel Pro和MySQLWorkbench中尝试了相同的结果
我正在尝试在 Laravel 5.8 中进行一些表单验证,
但即使在没有required规则的字段上,它也会抛出错误......
例如:
request()->validate([
'username' => ['required','alpha_num','max:40'],
'email' => ['email','max:100'],
]);
Run Code Online (Sandbox Code Playgroud)
如果我将email表单上的字段保留为“空”(不是必需的),则它无法提交并显示此错误:The email must be a valid email address.
我不明白,为什么会发生这种情况?required当这是 Laravel 验证的行为时,规则的用途是什么?
来自 CodeIgniter 社区,这令人困惑。
我还应该nullable在可以为空的字段中包含规则吗?
我在所有 Traits 中都使用了 Laravel 助手,假设助手函数在任何地方都可以工作。
但是,虽然有些功能像abort()工作一样,但我刚刚意识到return redirect()并且return back()不起作用!
有人可以解释一下为什么吗?
在此之后,我有点犹豫是否要相信 Laravel...我的意思是,如果下次在abort(403)某些地方不起作用(因为我不知道哪个功能在哪里起作用)并且有人做了他们不允许的事情怎么办去做!
简化示例:
namespace App\Http\Traits;
trait TestTrait{
public function doBack(){
return back();
}
public function doRedirect(){
return redirect()->route('test');
}
public function doAbort(){
abort(403);
}
}
use App\Http\Traits\TestTrait;
class TestController extends Controller{
use TestTrait;
public function testingBack(){
$this->doBack();
}
public function testingRedirect(){
$this->doRedirect();
}
public function testingAbort(){
$this->doAbort();
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例控制器中,testingAbort()方法可以工作,但testingRedirect()不能testingBack()!他们显示一个空白页面。
我假设我必须在控制器本身(而不是在 Traits 中)进行重定向,但这会导致在控制器方法中重复大量条件代码,而且我也不确定为什么会发生这种情况。
我正在使用 Fortify (Laravel 8),它确实为login和提供了 RateLimiter two-factor,但不为forgot-password请求提供。
如果没有(IP 地址)RateLimiter,一个非常简单的机器人就可以执行大量外发电子邮件,基本上会导致电子邮件服务暂停,或者在使用按发送电子邮件数量收费的 SMTP 服务时造成巨大成本。
我已经尝试过:
RateLimiter::for('forgot-password', function (Request $request) {
return Limit::perMinute(1)->by($request->ip());
});
Run Code Online (Sandbox Code Playgroud)
在我的FortifyServiceProvider.php,但它不起作用!
文件中也没有routes/web.php手动应用节流中间件的路由。
即使网站落后于CloudFlare CDN,我们还是决定使用OPCache来减少服务器上的负载,因为最大(峰值)每秒约有400个活动用户(大多数情况下为50-100 u / s)。
但是大多数页面的每个用户都有一些不同的数据,例如用户的仪表板概述,大多数数据是相同的,但是每个用户需要更新的数字却有所不同。
PS该网站在PHP 7.3.4上运行