首页 > 解决方案 > 为什么我不能在 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
    ]);
}

标签: laravel

解决方案


根据评论,您不能将语句直接放在类构造中,而必须将其放在函数或类的构造函数中。

但也要注意:

原始语句将作为字符串注入到查询中,因此您应该非常小心,不要造成 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
]);

推荐阅读