laravel - 为什么我不能在 Laravel 6 中将数据插入到 db 中?
问题描述
我想插入数据以db
仅使用DB::insert
.
所以,我有这行代码:
DB::insert("INSERT INTO `users` (`vk_id`, `name`, `email`) VALUES ($user->id, $user->name, $user->email)");
我确实使用use Illuminate\Support\Facades\DB;
但我有一个错误:
语法错误,意外的 'DB' (T_STRING),期望函数 (T_FUNCTION) 或 const (T_CONST)
这个错误的原因是什么?
整个文件代码
<?php
namespace SocialiteProviders\VKontakte;
use Illuminate\Support\Arr;
use Laravel\Socialite\Two\InvalidStateException;
use SocialiteProviders\Manager\OAuth2\AbstractProvider;
use SocialiteProviders\Manager\OAuth2\User;
use Illuminate\Support\Facades\DB;
class Provider extends AbstractProvider
{
protected $fields = ['id', 'email', 'first_name', 'last_name', 'screen_name', 'photo_200'];
/**
* Unique Provider Identifier.
*/
const IDENTIFIER = 'VKONTAKTE';
/**
* {@inheritdoc}
*/
protected $stateless = true;
/**
* {@inheritdoc}
*/
protected $scopes = ['email'];
/**
* Last API version.
*/
const VERSION = '5.92';
/**
* {@inheritdoc}
*/
protected function getAuthUrl($state)
{
return $this->buildAuthUrlFromBase(
'https://oauth.vk.com/authorize', $state
);
}
/**
* {@inheritdoc}
*/
protected function getTokenUrl()
{
return 'https://oauth.vk.com/access_token';
}
/**
* {@inheritdoc}
*/
protected function getUserByToken($token)
{
$from_token = [];
if (is_array($token)) {
$from_token["email"] = isset($token["email"]) ? $token["email"] : null;
$token = $token["access_token"];
}
$params = http_build_query([
'access_token' => $token,
'fields' => implode(',', $this->fields),
'lang' => $this->getConfig('lang', 'en'),
'v' => self::VERSION,
]);
$response = $this->getHttpClient()->get('https://api.vk.com/method/users.get?' . $params);
$contents = $response->getBody()->getContents();
$response = json_decode($contents, true);
if (!is_array($response) || !isset($response['response'][0])) {
throw new \RuntimeException(sprintf(
'Invalid JSON response from VK: %s',
$contents
));
}
return array_merge($from_token, $response['response'][0]);
}
/**
* {@inheritdoc}
*/
public function user() {
if ($this->hasInvalidState()) {
throw new InvalidStateException;
}
$response = $this->getAccessTokenResponse($this->getCode());
$user = $this->mapUserToObject($this->getUserByToken($response));
$this->credentialsResponseBody = $response;
if ($user instanceof User) {
$user->setAccessTokenResponseBody($this->credentialsResponseBody);
}
return $user->setToken($this->parseAccessToken($response))
->setExpiresIn($this->parseExpiresIn($response));
}
/**
* {@inheritdoc}
*/
protected function mapUserToObject(array $user)
{
return (new User())->setRaw($user)->map([
'id' => Arr::get($user, 'id'),
'nickname' => Arr::get($user, 'screen_name'),
'name' => trim(Arr::get($user, 'first_name').' '.Arr::get($user, 'last_name')),
'email' => Arr::get($user, 'email'),
'avatar' => Arr::get($user, 'photo_200'),
]);
}
/**
* {@inheritdoc}
*/
protected function getTokenFields($code)
{
return array_merge(parent::getTokenFields($code), [
'grant_type' => 'authorization_code',
]);
}
/**
* Set the user fields to request from Vkontakte.
*
* @param array $fields
*
* @return $this
*/
public function fields(array $fields)
{
$this->fields = $fields;
return $this;
}
/**
* {@inheritdoc}
*/
public static function additionalConfigKeys()
{
return ['lang'];
}
DB::insert('insert into users (vk_id, name, email) values (?, ?, ?)', [
$user->id, $user->name, $user->email
]);
}
解决方案
根据评论,您不能将语句直接放在类构造中,而必须将其放在函数或类的构造函数中。
但也要注意:
原始语句将作为字符串注入到查询中,因此您应该非常小心,不要造成 SQL 注入漏洞。
所以最好改用这个语句,因为参数绑定提供了防止 SQL 注入的保护:
use Illuminate\Support\Facades\DB;
DB::insert('insert into users (vk_id, name, email) values (?, ?, ?)', [
$user->id, $user->name, $user->email
]);
或者简单地说:
use Illuminate\Support\Facades\DB;
DB::table('users')->insert([
'vk_id' => $user->id,
'email' => $user->email,
'name' => $user->name
]);
推荐阅读
- python - 在多个数据框中为多列申请循环?
- python - Python 聊天机器人实现到网站?
- batch-file - 从命令中获取 USB 驱动器号并将它们用作选择变量
- docker - 文件更改保存后 Meteor 构建刷新会在 Docker 容器中丢弃 EACCES 错误
- node.js - 使用 Mongoose 实现 ACL 的最佳方法
- android - 使用 JodaTime 格式化伊斯兰地区的日期
- swift - PKHUD 和目标 c 错误
- r - 如何找出R中的警告
- git - Git突然停止工作(passwd文件)
- google-sheets - Google 财经无法识别我的日期字段并返回错误消息