Ошибка синтаксиса или нарушение прав доступа

Я пытаюсь создать подготовленный оператор с использованием PDO, который позволит мне создавать пользователей mysql, используя данные, собранные из формы. Когда я запускаю команду, я получаю ошибку:

SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MySQL, для правильного синтаксиса для использования рядом с » select ‘ON’ testjoke.authors ‘to’ corey ‘@’ localhost » в строке 1

  • Попытка заставить INSERT вставлять только новые данные
  • PDO Возврат всех строк
  • Можете ли вы использовать именованные параметры в Laravel Rloquent
  • Запрашивать фактический SQL-запрос с помощью ActiveRecord с Yii2?
  • Мой код регистрации Sql не работает

В настоящее время я просто использую данные из некоторых переменных, которые я создал для тестирования, вместо данных из формы. Код выглядит так:

$grantQuery = $db->prepare("GRANT ? ON ? TO ?@'localhost';"); $select = 'select'; $testjoke = 'testjoke.authors'; $pdoemail = 'corey'; $grantQuery ->execute(array( $select, $testjoke, $pdoemail )); 

Я включил общий журнал Mysql, и запрос никогда не появляется на нем (никогда не исполнялся).

Я пытаюсь найти исправление для этого на пару дней, но мне не повезло.

  • Обработка сложных предложений WHERE с помощью PHP Query Builder
  • Как предотвратить атаку SQL Injection в приложениях, запрограммированных в Zend Framework?
  • Наилучшая практика MySQL: дети SELECT рекурсивны, насколько это возможно?
  • Как сохранить номер версии в базе данных MySQL
  • Как превратить строки MySQL в эквиваленты SQL Server

Любая помощь будет принята с благодарностью.

Благодаря Corey

Related of «SQLSTATE : ошибка синтаксиса или нарушение доступа – подготовленный отчет PDO «GRANT»»

Как вы не можете написать SELECT ? FROM ? SELECT ? FROM ? , вы также не можете разделить GRANT на подготовленный запрос.

Подготовленные значения запроса могут быть только значениями. Из соображений безопасности среди многих других вы не можете передавать ключевые слова. Единственным параметром, который может работать в вашем случае, является имя пользователя, так как это строка.

PDO пытается запустить:

 GRANT 'select' ON 'testjoke.authors' TO 'cory':'localhost'; 

Вы можете понять, почему это не сработает, надеюсь.

Вопрос:

Я переношу свои локальные файлы в Интернете и имею проблемы с PHP с моим db script. Работает нормально локально (работает PHP 5.3.8), но дает мне следующие ошибки на моем сервере (PHP 5.3.10)

Без $DBH- > setAttribute (PDO:: ATTR_ERRMODE, PDO:: ERRMODE_EXCEPTION);

Неустранимая ошибка: вызов функции-члена setFetchMode() для не-объекта в /…/…php в строке 108

С $DBH- > setAttribute (PDO:: ATTR_ERRMODE, PDO:: ERRMODE_EXCEPTION);

SQLSTATE [42000]: ошибка синтаксиса или нарушение прав доступа: команда 1142 SELECT запрещена для пользователя ‘…’ @’205.186.180.26′ для приглашенной таблицы

Вот мой код:

class guest {
public $id;
public $guest_name;
public $url_phrase;
}

$guest = new guest;

if (isset($_GET['p'])) {
$url_phrase = urldecode($_GET['p']);
} else if (isset($_POST['p'])) {
$url_phrase = urldecode($_POST['p']);
}

if (isset($url_phrase)) {

try {

$DBH = new PDO("mysql:host=myhost.com;dbname=mydbname", "myusername", "mypassword");
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$url_phrase = $DBH->quote($url_phrase);
$sql = "SELECT id, guest_name, url_phrase FROM mydbname.invited WHERE url_phrase = $url_phrase";

$stmt = $DBH->query($sql);
$stmt->setFetchMode(PDO::FETCH_INTO, new guest);

$guestNumber = $stmt->rowCount();

if($guestNumber > 0) {
etc...
}
if($guestType == "solo") {
foreach($stmt as $guest) {
$name = $guest->guest_name;
etc...
}
}
} else {
other stuff.. etc..
$DBH = null;
} catch (PDOException $e) {
echo $e->getMessage();
}
}

У меня есть простые операторы выбора, чтобы нормально работать с этим пользователем (я не думаю, что это связано с разрешением), моя проблема, похоже, связана с моей реализацией PDO. Как я могу избавиться от этой ошибки? Подготавливаю/выполню выражение странным способом, который испортил это? Спасибо за любую помощь

Ответ №1

У меня была та же проблема. После того, как я загрузил свой код с локального на рабочий сервер, и у пользователя были все привилегии. Проблема была в имени базы данных – в моей локальной среде это было что-то вроде dattabase1, а в производстве имя было другим… prefix_ddatabas1. Я изменил имя базы данных на правильный, и все было в порядке.

Ответ №2

Звучит как проблема доступа на сервере:

SQLSTATE [42000]: Синтаксическая ошибка или нарушение доступа: 1142 Команда SELECT отказано пользователю ‘…’ @’205.186.180.26′ для приглашения таблицы ‘

Были ли вы протестированы из CLI (или какого-либо другого клиента sql за пределами PHP), чтобы обеспечить доступ к вашему script?

Вам, скорее всего, потребуется войти в db, чтобы предоставить доступ к пользователю, с которым работает ваш script, или проверить, что учетные данные, которые вы используете в script, точны для db в серверной среде.

Ответ №3

У меня была такая же проблема, код работал на dev-сервере, но не на prod-сервере, и работали другие скрипты, работающие с одной таблицей. Я пропустил исправление префиксов таблицы базы данных между средой разработчиков и prod. (имена базы данных не совпадают) ^^

Ответ №4

Я получил ту же ошибку. Имя разработчика было отличным от имени производственного БД, что вызвало эту ошибку. Я изменил имя db в моем коде на имя производственного БД, и оно сработало.

Спасибо

Ответ №5

У вас есть нарушение прав доступа:

Syntax error or access violation

Пользователь/хост, который вы используете:

1142 SELECT command denied to user '...'@'205.186.180.26'

не может выбрать из таблицы “приглашение”

  

pincet

16.01.15 — 11:33

кусок запроса

|WHERE 1=1

|AND M.MANDT=’500′

|AND M.CHARG=’1215010801′

|AND MA.MATKL=?

код 1с

command=createobject(«ADODB.Command»);

command.ActiveConnection=sapADO;

command.CommandType=1;

command.CommandText=commandText;

command.Parameters.Append(command.CreateParameter(«@matkl»,129,1,8,»1145100″));

command.Execute(,,);

вываливается с ошибкой

Microsoft OLE DB Provider for SQL Server: Incorrect syntax near the keyword ‘DEFAULT’

в где править?

  

aka AMIGO

Модератор

1 — 16.01.15 — 11:38

»

   pincet

2 — 16.01.15 — 15:13

самое печальное в том, что из vba, к примеру, все отрабатывает

  

spectre1978

3 — 16.01.15 — 23:38

А что за база?

На Access я бы, к примеру, написал

AND MA.MATKL=:MATKL

  

spectre1978

4 — 16.01.15 — 23:39

и далее CreateParameter(«matkl», …

  

b_ru

5 — 17.01.15 — 00:06

Вроде в тексте ошибки все ясно написано, а тс даже текст запроса зажал. Я вот не помню, чтобы в oracle sql ключевое слово DEFAULT можно было в DML использовать.

З.Ы. Базис то уши не надерет за прямую работу с таблицами БД? Или это перевалочная база какая-то?

  

pincet

6 — 19.01.15 — 09:16

(5) не надерет, там схема только чтение

В тексте-то написано, но никаких DEFAULT я в T-SQL не знаю

Сервер — сиквел.

А запрос — мне не жалко , вот

|SELECT MAT    

            |,CAST([031] AS DATE) FISHDATE

            |,[032] PLANT

            |,[043] [RAW]

            |,CAST([049] AS FLOAT) PRICE

            |,CAST([050] AS FLOAT) VPRICE

            |,CAST([400] AS DATE) LOBM_VFDAT

            |,[422] LOBM_HSDAT

            |

            |FROM

            |(

            |

            |SELECT MA.MATNR MAT

            |    ,PIVOTF=

            |    CASE

            |        WHEN ATINN=’0000000031′ THEN STR(ATFLV)

            |        WHEN ATINN=’0000000032′ THEN ATWRT

            |        WHEN ATINN=’0000000043′ THEN ATWRT

            |        WHEN ATINN=’0000000049′ THEN STR(ATFLV,6,2)

            |        WHEN ATINN=’0000000050′ THEN STR(ATFLV,6,2)

            |        WHEN ATINN=’9999999400′ THEN STR(ATFLV)

            |        WHEN ATINN=’9999999422′ THEN STR(ATFLV)

            |    END

            |    ,SUBSTRING(ATINN,8,3) ATINNN

            |FROM MCH1 M

            |INNER JOIN MARA MA

            |ON MA.MANDT=M.MANDT

            |AND MA.MATNR=M.MATNR

            |INNER JOIN AUSP AU

            |ON M.MANDT=AU.MANDT

            |AND M.CUOBJ_BM=AU.OBJEK

            |WHERE 1=1

            |AND M.MANDT=’500′

            |AND M.CHARG=’1215010801′

            |AND MA.MATKL=@matkl) PT

            |

            |PIVOT

            |(    

            |        max(PIVOTF) FOR ATINNN IN([031],[032],[043],[049],[050],[400],[422])

            |) P

            |»;

  

pincet

7 — 19.01.15 — 09:17

(6) вместо

AND MA.MATKL=@matkl

читать AND MA.MATKL=?

  

Jaap Vduul

8 — 19.01.15 — 09:52

‘default’ oledb провайдер подставляет в качестве значения при создании параметра, что-то типа такого:

declare @p1 varchar(8)

set @p1=default

Потом default заменяется на значение параметра.

Т.е. похоже в данном случае ado не может корректно распарсить текст запроса и ожидает значение более чем для одного параметра.

Можно попробовать добавить ещё одно объявление параметра (command.Parameters.Append(command.CreateParameter(…), т.е. что-то типа заглушки.

  

pincet

9 — 19.01.15 — 10:07

Я думаю не ADO, а 1с++ глючит где-то.

Добавить еще один параметр — не взлетает тоже, ошибка

Microsoft OLE DB Provider for SQL Server: Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена.

Что, в принципе, предсказуемо

Неужели будлокодить придется и конструировать текст запроса при помощи + ?

  

Ёпрст

10 — 19.01.15 — 10:09

>>>а 1с++ глючит где-то.

1с++ тут то вообще коим боком ?????

И еще, если есть 1с++, нахрена весь этот нелепый код  с АДО ???

  

Jaap Vduul

11 — 19.01.15 — 10:11

(10) +1

(9) Перед command.Execute() проверь, что у тебя в коллекции command.Parameters находится. Ну и я бы первым делом в профайлере посмотрел, что на сервер из 1цэ отправляется.

  

pincet

12 — 19.01.15 — 10:50

(10) что такого нелепого в ADO?

  

pincet

13 — 19.01.15 — 10:56

(11) на сервер ничего не уходит (в профайлере трассы с моим запросом нет)

  

pincet

14 — 19.01.15 — 11:04

(11) в Parameters мой параметр

  

pincet

15 — 19.01.15 — 11:13

command.Parameters.Append(command.CreateParameter(«par1″,129,1,8,»1145100»));

message(command.Parameters(0).Name);

par1

  

Jaap Vduul

16 — 19.01.15 — 11:31

(12) Имелось в виду, что непонятно, почему используется ADO, если в конфигурации уже используется 1цэ++.

(13) >>на сервер ничего не уходит

Надо нормально настроить профайлер — либо фильтры стоят из-за которых не видно активности oledb, либо мониторятся не те события (используйте, например шаблон TSQL_Replay).

(14), (15) >>в Parameters мой параметр

Это и так понятно. Но ведь там, скорее всего, ещё что-то нежелательное.

command.Parameters.count?

  

pincet

17 — 19.01.15 — 11:32

(16)

message(command.Parameters.count)

1

  

pincet

18 — 19.01.15 — 11:33

По незнанию думалось, что ADODB.Connection требует 1с++

  

Jaap Vduul

19 — 19.01.15 — 11:38

(17)

command.Parameters(0).value?

Ещё можно попробовать не создавать явно параметр, а вместо этого использовать command.Parameters.refresh()

и затем установить значение параметра:

command.Parameters(0).value = …

  

pincet

20 — 19.01.15 — 11:45

на refresh()

Microsoft OLE DB Provider for SQL Server: Ошибка синтаксиса или нарушение прав доступа

  

Jaap Vduul

21 — 19.01.15 — 11:59

(20)Точно, oledb не может распарсить текст запроса, когда токены параметров находятся внутри вложенного запроса.

Переписывай на использование временной таблицы или хранимки.

  

pincet

22 — 19.01.15 — 12:30

(21) Excel и 1цэ пользуют один (SQLOLEDB) драйвер.

так вот Excel все спокойно хавает ЧЯДНТ?

  

pincet

23 — 19.01.15 — 15:21

up

  

pincet

24 — 19.01.15 — 15:58

шишкин лес. Даже Provider=SQLNCLI10 ругается

Microsoft SQL Server Native Client 10.0: Incorrect syntax near the keyword ‘DEFAULT’

ппц какой-то

  

pincet

25 — 19.01.15 — 16:15

(16) включил только события oledb — тишина на сервере

  

pincet

26 — 19.01.15 — 16:17

(25) только есть подозрение, что это монитор вызовов со стороны сервера, а не к нему

  

Fragster

27 — 19.01.15 — 16:19

Команда = СоздатьКомандуАДО(Соединение,

        «SELECT

        |    [DOCUMENTTYPE]

        |    ,[RECORDID]

        |    ,[STATUS]

        |    ,[LOADEDDATETIME]

        |    ,[ITEMID]

        |    ,[ITEMBarcode]

        |FROM [FSINVENTBarcodeDAX]

        |WHERE

        |    RecordId IN

        |        (SELECT

        |            Min([RECORDID])

        |        FROM

        |            [FSINVENTBarcodeDAX]

        |        WHERE

        |            [STATUS] = ?

        |        GROUP BY

        |            [ITEMBarcode])

        |»);

    

    Параметры = Новый COMSafeArray(«VT_VARIANT», 1);

    Параметры.SetValue(0, мСтатусыСтрок.Выгружено);

    
    Recordset = Команда.Execute(,Параметры);

Функция СоздатьКомандуАДО(Соединение, Текст)

    Команда = Новый ComОбъект(«ADODB.Command»);

    Команда.ActiveConnection = Соединение;

    

    Команда.CommandType = мМагияСКЛ.adCmdText;

    Команда.Prepared = Истина;

    

    Команда.CommandText = Текст;

    Возврат Команда;

КонецФункции

  

Fragster

28 — 19.01.15 — 16:20

// магические числа

мМагияСКЛ = Новый Структура;

мМагияСКЛ.Вставить(«adCmdText», 1);

  

pincet

29 — 19.01.15 — 16:39

:D спасибо, все гораздо проще (впрочем, как обычно)

command.Execute();

и все.

  

Ёпрст

30 — 19.01.15 — 16:40

Строка соединения какая хоть ?

  

Ёпрст

31 — 19.01.15 — 16:40

command.Parameters(0).value?

  

Ёпрст

32 — 19.01.15 — 16:42

и еще, на всякий..в качестве бреда пита:

//command.Parameters.Append(command.CreateParameter(«par1″,129,1,8,»1145100»));

Param = Command.CreateParameter(«par1»,129,1);

Command.Parameters.Append(Param );

Param.Value = «1145100»;

  

pincet

33 — 19.01.15 — 16:47

пичалька только в execute() — вся благородная публика (со мной во главе) не заметила про execute(,,). Вот и вся любовь

  

pincet

34 — 19.01.15 — 16:49

(10) 1с++ видимо рациональней пользовать — с ADO много лисапедов рисовать придется

  

Ёпрст

35 — 19.01.15 — 16:58

(34) с 1cpp , просто проще и удобнее

Как предположил Магнус Эрикссон, с моим методом POST возникла проблема … даже если он казался нормальным, моя переменная custom_n имела странный вывод var_dump string(12)»». Я помню, что раньше я использовал тот же код и работал, поэтому я просто изменяю код, чтобы он был точно таким же: на странице, на которой у меня есть форма, которая отправляет «переменную POST», я использовал этот код:

<?php 

            $servername = "localhost";
            $username = "root";
            $password = "";

            $custom_n = array();

            try {
                $conn = new PDO("mysql:host=$servername;dbname=classicmodels", $username, $password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                $stmt = $conn -> prepare("SELECT checkNumber, paymentDate, amount, customerNumber FROM payments ORDER BY paymentDate DESC");
                $stmt -> execute();
                $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
                foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
                    echo $v;
                    if ($k == 'customerNumber') {
                        array_push($custom_n, $v);
                    }
                }

                $tableCodes = "<table id='buttons'>";
                foreach ($custom_n as $c) {
                    $tableCodes .= "
                        <tr>
                            <td>
                                <form action='customers.php' method='post' target='POPUPW' onsubmit="POPUPW = window.open('about:blank','POPUPW', 'width=800px,height=600px');">
                                    <button type='submit' name='code' value='$c'>Details</button>
                                </form>
                            </td>
                        </tr>
                    ";
                }
                $tableCodes .= "</table>";
                echo $tableCodes;
            }
            catch(PDOException $e) {
                echo "Connection failed: " . $e->getMessage();
            }

            $conn = null;

        ?>

Я подумал, что мог бы сэкономить время, получая custom_n из другого запроса, который я делаю для заполнения таблицы на этой странице, вместо того, чтобы делать другой запрос. Я не совсем уверен, что с этим не так, но с этим изменением я решил проблему:

<?php 

            $servername = "localhost";
            $username = "root";
            $password = "";

            try {
                $conn = new PDO("mysql:host=$servername;dbname=classicmodels", $username, $password);
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

                $stmt = $conn -> prepare("SELECT checkNumber, paymentDate, amount, customerNumber FROM payments ORDER BY paymentDate DESC");
                $stmt -> execute();
                $result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
                foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
                    echo $v; 
                }

                $customQuery = $conn -> prepare("SELECT customerNumber FROM payments ORDER BY paymentDate DESC");
                $customQuery -> execute();
                $custom = $customQuery->fetchAll(PDO::FETCH_COLUMN);
                $tableCodes = "<table id='buttons'>";
                foreach ($custom as $c) {
                    $tableCodes .= "
                        <tr>
                            <td>
                                <form action='customers.php' method='post' target='POPUPW' onsubmit="POPUPW = window.open('about:blank','POPUPW', 'width=800px,height=600px');">
                                    <button type='submit' name='emp' value='$c'>Details</button>
                                </form>
                            </td>
                        </tr>
                    ";
                }
                $tableCodes .= "</table>";
                echo $tableCodes;
            }
            catch(PDOException $e) {
                echo "Connection failed: " . $e->getMessage();
            }

            $conn = null;

        ?>

Я должен поблагодарить всех, в частности MagnusEriksson, MasivuyeCokile и Pr1nc3, без которых я бы никогда не узнал о параметризованных подготовленных операторах.
Большое спасибо, и если вы узнаете, почему предыдущий код не работал, не стесняйтесь комментировать: D.

Я получаю эту ошибку в почтовом клиенте при работе с PHP REST API:

Неустранимая ошибка : Uncaught PDOException: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования с’isting_name = ‘name’, address = ‘test’, po … ‘в строке 2 в C: xampp htdocs project dTb models Listing.php: 137 Трассировка стека:

Вот моя модель

// Создание  Post

public function create(){

// запрос

$query = ‘INSERT INTO ‘ . $this->table . 

            ‘SET

            listing_name = :listing_name,

            address = :address,

            postal_code = :postal_code,

            google_id = :google_id,

            website = :website,

            tag_array = :tag_array,

            area_array = :area_array’;

            // подготовка выражения

            $stmt = $this->conn->prepare($query);

            // очитска данных

            $this->listing_name = htmlspecialchars(strip_tags($this->listing_name));

            $this->address = htmlspecialchars(strip_tags($this->address));

            $this->postal_code = htmlspecialchars(strip_tags($this->postal_code));

            $this->google_id = htmlspecialchars(strip_tags($this->google_id));

            $this->website = htmlspecialchars(strip_tags($this->website));

            $this->tag_array = htmlspecialchars(strip_tags($this->tag_array));

            $this->area_array = htmlspecialchars(strip_tags($this->area_array));

            // привязка данных

            $stmt->bindParam(‘:listing_name’, $this->listing_name);

            $stmt->bindParam(‘:address’, $this->address);

            $stmt->bindParam(‘:postal_code’, $this->postal_code);

            $stmt->bindParam(‘:google_id’, $this->google_id);

            $stmt->bindParam(‘:website’, $this->website);

            $stmt->bindParam(‘:tag_array’, $this->tag_array);

            $stmt->bindParam(‘:area_array’, $this->area_array);

            // выполнение запроса

            if($stmt->execute()) {

                return true;

            }

            printf(«Error: %s «, $stmt->error);

}

create.php

<?php 

// заголовки

header(‘Access-Control-Allow-Origin: *’);

header(‘Access-Control-Allow-Methods: POST’);

header(‘Access-Control-Allow-Headers: Access-Control-Allow-Headers, Access-Control-Allow-Methods, Authorization, X-Requested-With’);

include_once ‘../../config/Database.php’;

include_once ‘../../models/Listing.php’;

// инициализация БД и соединения

$database = new Database();

$db = $database->connect();

// инициализация списка объектов

$listing = new Listing($db);

// получение сырых POST данных

$data = json_decode(file_get_contents(«php://input»));

$listing->listing_name = $data->listing_name;

$listing->address = $data->address;

$listing->postal_code = $data->postal_code;

$listing->google_id = $data->google_id;

$listing->website = $data->website;

$listing->tag_array = $data->tag_array;

$listing->area_array = $data->area_array;

// создание листинга

if($listing->create()){

    echo json_encode(

        array(‘message’ => ‘Post создан)

    );

} else {

    echo json_encode(

        array(‘message’ => ‘Список не создан’)

    );

}

Вывод:

{

«listing_name»: «test name»,

«address»: «test address»,

«postal_code»: «n12 345»,

«google_id»: «googleid»,

«website»: «website»,

«tag_array»: «tagarray, array»,

«area_array»: «areaarray, array»

}

Ответ 1

Попробуйте добавить пробел перед «SET» в своем запросе

$query = ‘INSERT INTO ‘. 

            $this->table. 

            ‘ SET

            listing_name = :listing_name,

24 ответа

Проблема решается следующим образом.

Добавьте следующий код в AppServiceProvider.php

L5_root/app/Providers/AppServiceProvider.php

Кодовый блок

use IlluminateSupportFacadesSchema; //Import Schema

function boot()
{
    Schema::defaultStringLength(191); //Solved by increasing StringLength
}

MySQL всегда резервирует максимальную сумму для поля UTF8, которое составляет 4 байта, поэтому с 255 + 255 с вашим DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; вы превысили ограничение длины ключа 767. По @scaisedge

absiddiqueLive
15 фев. 2017, в 11:00

Поделиться

Я не знаю, почему это решение и официальное решение, добавляющее

Schema::defaultStringLength(191);

in AppServiceProvider не работал у меня.
Работала для редактирования файла database.php в папке config.
Просто отредактируйте

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

to

'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

и он должен работать.
Надеюсь, что это поможет.

Koushik Das
17 сен. 2017, в 08:30

Поделиться

Я просто добавляю этот ответ здесь, так как это самое quickest решение для меня. Просто установите ядро базы данных по умолчанию на 'InnoDB' на

/config/database.php

'mysql' => [
    ...,
    ...,
    'engine' => 'InnoDB',
 ]

затем запустите php artisan config:cache чтобы очистить и обновить кеш конфигурации

Dexter Bengil
09 окт. 2017, в 08:46

Поделиться

В AppServiceProvider.php вы включаете этот код вверху файла.

use IlluminateSupportFacadesSchema;

И вы добавляете этот код в метод загрузки.

 Schema::defaultStringLength(191);

user7688086
10 март 2017, в 05:13

Поделиться

Эта проблема вызвана в Laravel 5.4 версией базы данных.

В соответствии с docs (в разделе Index Lengths & MySQL / MariaDB):

Laravel использует набор символов utf8mb4 по умолчанию, который включает поддержка хранения «emojis» в базе данных. Если вы используете версия MySQL старше версии 5.7.7 или MariaDB старше, чем выпуск 10.2.2, вам может потребоваться вручную настроить по умолчанию длина строки, генерируемая миграциями, чтобы MySQL мог создавать индексы для них. Вы можете настроить это, вызвав Schema::defaultStringLength в вашем AppServiceProvider.

Иными словами, в <ROOT>/app/Providers/AppServiceProvider.php:

// Import Schema
use IlluminateSupportFacadesSchema;
// ...

class AppServiceProvider extends ServiceProvider
{

public function boot()
{
    // Add the following line
    Schema::defaultStringLength(191);
}

// ...

}

Но как говорится в другом ответе:

Будьте осторожны с этим решением. Если вы указали, например, поля электронной почты, хранящиеся электронные письма могут иметь максимальную длину 191 символов. Это меньше чем официальные RFC-государства.

Таким образом, в документации также предлагается другое решение:

В качестве альтернативы вы можете включить параметр innodb_large_prefix для своего база данных. Обратитесь к документации по базе данных для получения инструкций по как правильно включить эту опцию.

Esteban Herrera
20 фев. 2017, в 19:48

Поделиться

Для тех, кто не хочет менять AppServiceProvider.php. (На мой взгляд, это плохая идея, чтобы изменить AppServiceProvider.php только для миграции)

Вы можете добавить обратно длину данных в файл миграции в database/migrations/ как показано ниже:

create_users_table.php

$table->string('name',64);
$table->string('email',128)->unique();

create_password_resets_table.php

$table->string('email',128)->index();

helloroy
21 апр. 2017, в 17:47

Поделиться

Я решил эту проблему и отредактировал мой файл config-> database.php так, чтобы он соответствовал моей базе данных (‘charset’ => ‘utf8’) и (‘collation’ => ‘utf8_general_ci’), поэтому моя проблема решена кодом следующим образом:

'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8',
        'collation' => 'utf8_general_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],

Ahmad Shakib
20 апр. 2018, в 07:26

Поделиться

Вместо того, чтобы устанавливать ограничение по длине, я бы предложил следующее, что сработало для меня.

внутри

конфиг /database.php

заменить эту строку для MySQL

'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',

на

'engine' => null,

Md. Noor-A-Alam Siddique
24 июль 2017, в 21:40

Поделиться

Добавьте приведенный ниже код в метод app/Providers/AppServiceProvider.php:

use IlluminateSupportFacadesSchema;

public function boot()
{
    Schema::defaultStringLength(191);
}

сначала нужно удалить (если есть) таблицу пользователей, таблицу password_resets из базы данных и удалить записи пользователей и password_resets из таблицы миграции, а затем после удаления старых таблиц запустить команду php artisan migrate

Udhav Sarvaiya
08 фев. 2018, в 07:40

Поделиться

Как уже было указано, мы добавляем файл AppServiceProvider.php в App/Providers.

use IlluminateSupportFacadesSchema;  // add this

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Schema::defaultStringLength(191); // also this line
}

Вы можете увидеть более подробную информацию в ссылке ниже (поиск «Длина индекса и MySQL/MariaDB») https://laravel.com/docs/5.5/migrations

НО ХОРОШО, ЧТО НЕ ТО, ЧТО Я ПИШУ дело даже в том, что при выполнении вышеупомянутого вы, вероятно, получите другую ошибку (когда вы запускаете команду php artisan migrate и из-за проблемы длины, операция, скорее всего, застрянет в середине. решение находится ниже, а таблица пользователей — ниже). скорее всего создан без остатка или не совсем корректно) надо откатиться. откат по умолчанию не будет работать. потому что операция миграции не понравилась. Вам необходимо удалить новые созданные таблицы в базе данных вручную.

мы можем сделать это используя тинкер, как показано ниже:

L:todos> php artisan tinker

Psy Shell v0.8.15 (PHP 7.1.10 — cli) by Justin Hileman

>>> Schema::drop('users')

=> null

У меня самого была проблема с таблицей пользователей.

после этого ты можешь идти

php artisan migrate:rollback

php artisan migrate

Mohamed Allal
17 янв. 2018, в 21:26

Поделиться

Schema::defaultStringLength(191); по умолчанию определит длину всех строк 191, что может испортить вашу базу данных. Вы не должны идти по этому пути.

Просто определите длину любого конкретного столбца в классе миграции базы данных. Например, я определяю «имя», «имя пользователя» и «электронная почта» в классе CreateUsersTable как CreateUsersTable ниже:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name', 191);
            $table->string('username', 30)->unique();
            $table->string('email', 191)->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

Fatema T. Zuhora
23 апр. 2018, в 10:10

Поделиться

Как указано в руководстве по миграции, чтобы исправить это, все, что вам нужно сделать, это отредактировать файл app/Providers/AppServiceProvider.php и в методе загрузки установить длину строки по умолчанию:

use IlluminateSupportFacadesSchema;

public function boot()
{
    Schema::defaultStringLength(191);
}

Примечание: сначала вы должны удалить (если есть) таблицу пользователей, таблицу password_resets из базы данных и удалить записи пользователей и password_resets из таблицы миграции.

Чтобы выполнить все оставшиеся миграции, выполните команду migrate Artisan:

php artisan migrate

После этого все должно работать как обычно.

user9162235
19 янв. 2018, в 07:31

Поделиться

обновите и вставьте эти строки в app/Providers/AppServiceProvider.php

use IlluminateSupportFacadesSchema;  //insert this line
public function boot()
{
    Schema::defaultStringLength(191); //insert this line also
}

установите ваш движок базы данных в config/database.php в массиве «mysql»

'engine' => 'InnoDB',

Anjani Barnwal
28 сен. 2018, в 18:15

Поделиться

Я добавляю два решения, которые работают для меня.

1-е растворение это :

  1. Откройте файл database.php insde config dir/folder.
  2. Отредактируйте 'engine' => null, чтобы 'engine' => 'InnoDB',

    Это сработало для меня.

2-е решение:

  1. Откройте файл database.php insde config dir/folder.
    2. Изменить
    'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
    в

    'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',

Удачи

Arslan Ahmad
28 июнь 2018, в 14:11

Поделиться

Это часто встречается, поскольку Laravel 5.4 изменил установленный по умолчанию характер базы данных на utf8mb4. Что вы должны сделать, это: отредактируйте ваш AppProviders.php, поместив этот код перед объявлением класса

use IlluminateSupportFacadesSchema;

Также добавьте это в «загрузочную» функцию Schema::defaultStringLength(191);

Treasure
08 фев. 2018, в 10:54

Поделиться

Если вы хотите изменить приложение AppServiceProvider, вам необходимо определить длину поля электронной почты в процессе миграции. просто замените первую строку кода на вторую строку.

create_users_table

$table->string('email')->unique();
$table->string('email', 50)->unique();

create_password_resets_table

$table->string('email')->index();
$table->string('email', 50)->index();

После успешных изменений вы можете выполнить миграцию.
Примечание: сначала вам нужно удалить (если есть) таблица пользователей, пароль_resets table из базы данных и удалить записи пользователей и password_resets из таблицы миграции.

chintan kotadiya
25 июнь 2017, в 08:42

Поделиться

Рекомендуемое решение состоит в том, чтобы включить параметр MySQL innodb_large_prefix чтобы innodb_large_prefix последующих проблем. А вот как это сделать:

Откройте файл конфигурации my.ini MySQL и добавьте следующие строки под строкой [mysqld] следующим образом.

[mysqld]
innodb_file_format = Barracuda
innodb_large_prefix = 1
innodb_file_per_table = ON

После этого сохраните изменения и перезапустите службу MySQL.

Откат, если вам нужно, а затем повторно запустите миграцию.


На случай, если проблема не устранена, перейдите в файл конфигурации базы данных и установите

'engine' => null, чтобы 'engine' => 'innodb row_format=dynamic'

Надеюсь, поможет!

Sammie
28 нояб. 2018, в 08:42

Поделиться

Я только что изменил следующую строку в файле миграции users и password_resets.

Старый: $table->string('email')->unique();

Новое: $table->string('email', 128)->unique();

Вуаля !!

Mahesh Gaikwad
16 нояб. 2018, в 20:02

Поделиться

Я думаю, что заставить StringLenght на 191 действительно плохая идея. Поэтому я расследую, чтобы понять, что происходит.

Я заметил, что это сообщение об ошибке:

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1071 Указанный ключ слишком длинный; максимальная длина ключа 767 байт

Начал появляться после того, как я обновил свою версию MySQL. Поэтому я проверил таблицы с помощью PHPMyAdmin и заметил, что все новые таблицы были созданы с сопоставлением utf8mb4_unicode_ci вместо utf8_unicode_ci для старых.

В моем конфигурационном файле doctrine я заметил, что charset был установлен в utf8mb4, но все мои предыдущие таблицы были созданы в utf8, поэтому я думаю, что это какая-то магия обновления, которая начинает работать на utf8mb4.

Теперь несложное решение состоит в том, чтобы изменить линейный набор символов в вашем конфигурационном файле ORM. Затем удалите таблицы с помощью utf8mb4_unicode_ci, если вы находитесь в режиме разработки, или исправьте кодировку, если вы не можете их удалить.

Для Symfony 4

изменить кодировку: utf8mb4 на кодировку: utf8 в config/packages/doctrine.yaml

Теперь мои доктрины миграции снова работают хорошо.

Kaizoku Gambare
17 май 2018, в 09:37

Поделиться

Если вы столкнулись с этой ошибкой во время работы над laravel при использовании команды: «php artisan migrate», то вы просто добавляете в файл 2 строки: app-> Providers-> AppServiceProvider.php

  1. использовать схему;
  2. Схема :: defaultStringLength (191);

пожалуйста, проверьте изображение. затем снова запустите команду «php artisan migrate». php ремесленник мигрировать

Abdul Rasheed
17 янв. 2019, в 05:14

Поделиться

Подходящие к этой работе здесь передают второй параметр с ключевым именем (коротким):

$table->string('my_field_name')->unique(null,'key_name');

Tiago Gouvêa
24 июль 2018, в 13:38

Поделиться

Для всех, кто мог столкнуться с этим, моя проблема заключалась в том, что я делал столбец типа string и пытался сделать его ->unsigned() когда я хотел, чтобы он был целым числом.

Brynn Bateman
25 апр. 2018, в 19:32

Поделиться

Для меня, что работало, чтобы обновить зависимости, запустив.

Вам также следует установить последнюю версию mysql.

Mateo
28 авг. 2018, в 15:11

Поделиться

Ещё вопросы

  • 1Пользовательские вкладки в Android
  • 0Передача файла js из php в mongo
  • 1Модуль Экспортирует лучшие практики для класса ECMA6
  • 1SAX-разбор в программировании Android
  • 0Как я могу остановить запуск анимации CSS3 после ее однократного воспроизведения и вызвать новую?
  • 0Как ссылаться на другую таблицу по идентификатору?
  • 1C # Как объединить некоторые выражения Linq в цикле
  • 1Вызов метода Post веб-службы
  • 0Извлечение JSON из неизвестного ключа массива
  • 0Установите размер шрифта для <div> -box на h2
  • 0Проблемы с $ scope. $ Apply () во вложенных обратных вызовах
  • 1изображение исчезает при сворачивании формы, прокрутка не отображается
  • 0Класс Cakephp 3.0 ‘App Controller App’ не найден
  • 1Util Class в Java
  • 1Webpack с использованием IgnorePlugin генерирует ошибку webpackMissingModule
  • 1Третья строка ввода не читается
  • 1На выходе всегда получается пустой список
  • 1Ошибка установки locust.io (ошибка с состоянием выхода 2)
  • 1JavaScript заменить символ с циклом
  • 1Цвет ILLinePlot в зависимости от значения Y?
  • 0Cordova InAppBrowser показать адресную строку Cordova AngularJS Oauth
  • 0Проблемы с пониманием конструктора argList
  • 1Лучшая практика очистки ViewModelLocator
  • 0SDL Benchmark Sound
  • 0Угловая js загрузить локальный массив json
  • 0Как свернуть адаптивное вертикальное меню (скрыть-показать) после нажатия на элемент?
  • 0Неправильное отображение обхода двоичного дерева
  • 1Python Open CV оверлейное изображение на контуре большого изображения
  • 0Примечание: ошибка преобразования массива в строку при преобразовании массива из php в javascript
  • 0Ширина столбца в таблице HTML
  • 1Как хранить ключ шифрования .NET
  • 0Неопределенная ссылка для 1 из многих конструкторов для QVideoFrame
  • 1_.bindAll не работает при визуализации представления Backbone
  • 1как долго нажимается клавиша в Java
  • 1Макет чата с менеджером BoxLayout
  • 1Python Tkinter GUI формат грязной печати
  • 1Нет модуля с именем PIL после установки Pillow (v5.2.0) с pip v18.0
  • 1Python3: как получить все квадраты и кубики равными или меньшими числа
  • 1почему Linq намного быстрее
  • 1Не перенаправлять на страницу входа
  • 1Функции Firebase — добавление нового значения к старому значению
  • 1Изменение стоимости логистической регрессии становится постоянным
  • 1Динамическое обновление позиции ax.text в трехмерном точечном / точечном графике с помощью FuncAnimation
  • 1Logback усекается вместо добавления в файл журнала
  • 1Null Coalescing для строки в Int
  • 0Как преобразовать результат запроса базы данных в JSON, содержащийся в одном массиве?
  • 0Обложка + макет профиля
  • 1Получите информацию о файле почтового индекса — не от его содержания
  • 0Проблемы со ссылкой при разборе JSON
  • 0Mysql Перечисляет выбор всех столбцов с типом данных enum с определенным значением

Я хочу использовать WhereIn и Group By в одном запросе для получения результата.

Я пробовал это:

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();

Но я получил это сообщение об ошибке:

SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1055 ‘sbrtpt.loading.id’ не входит в GROUP BY (SQL: выберите * из загрузки, где идентификатор в (14, 15, 16) группе по vehicle_no)

8 ответов

Вероятно, это проблема SQL_MODE. В вашем config/database.php при подключении измените

strict => false

Как в

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', 'localhost'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
],


105

Antonio Carlos Ribeiro
1 Дек 2016 в 19:15

При использовании groupBy в eloquent всегда включайте имя столбца, используемое в функции groupBy в функции select ().

$loadids=explode("#@*",$reciptdet->loading_id);
$loadingdatas=DB::table('loading')->select('vehicle_no')->groupBy('vehicle_no')->whereIn('id',$loadids)->get();//add select('vehicle_no')

Также плохой практикой является отключение строгого режима в файле конфигурации. Это может привести к тому, что в базу данных попадут поврежденные данные, например недействительные даты, без каких-либо предупреждений. Не делайте этого без крайней необходимости.


6

Thungdemo
21 Июн 2018 в 08:23

Без изменения файла config database.php

Установка 'strict' => false в configdatabase.php может быть проблемой безопасности . Итак, простым решением Laravel может быть сначала вызов get(), а затем groupBy('vehicle_no) :

$loadids = explode("#@*", $reciptdet->loading_id);
$loadingdatas = DB::table('loading')->whereIn('id', $loadids)->get();
$grouped = $loadingdatas->groupBy('vehicle_no');


6

cespon
18 Фев 2019 в 01:12

У меня тоже была эта проблема, но после изменения 'strict' => true на 'strict' => false ошибка исчезла.

Вы можете найти эту настройку в:

config database.php

'mysql' => [
    ...
    'strict' => false,
    ...
]


5

Chuck Le Butt
25 Апр 2019 в 16:18

Это ограничение имеет смысл, поскольку когда вы используете GROUP BY в MySQL, оно возвращает по одной строке для каждого значения в столбцах, используемых в GROUP BY. Значит, значения других столбцов в выбранных строках нигде нет смысла использовать. Поэтому всегда рекомендуется использовать лучшие практики, и я бы рекомендовал не отключать MySQL Strict Mode.

Часто разработчикам могут потребоваться строки запроса, сгруппированные по значению столбца. Здесь им не нужна только одна строка на уникальные значения столбцов. Но им нужно несколько строк, сгруппированных по уникальным значениям определенного столбца. По какой-то причине они используют метод Laravel Query Builder groupBy, который генерирует MySQL-запрос GROUP BY, и разработчики сталкиваются с указанной выше ошибкой.

Решение их проблемы — использовать вместо этого метод коллекции groupBy. Например,

$loadingData = DB::table('loading')
    ->whereIn('id', $loadIds)
    ->get()
    ->groupBy('vehicle_no');

Это даст им желаемый результат.


2

Debiprasad
10 Янв 2020 в 11:16

Обновить config/database.php

Устанавливать:

'mysql' => [
           'strict' => false,
        ],

Вместо:

'mysql' => [
           'strict' => true,
        ],

И не забудьте очистить кеш:

php artisan config:cache


2

Gouda Elalfy
16 Мар 2020 в 10:46

Добавить Schema::defaultStringLength(191); в метод boot

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
         Schema::defaultStringLength(191);
    }
}


0

hamed hossani
16 Мар 2020 в 14:40

Вы также можете использовать:

отличный (‘vehicle_no’)

Вместо groupBy (‘vehicle_no’) каждый сценарий случая отличается, но, глядя на ваш запрос, можно выбрать отдельный вариант, поскольку вы не собираете данные.


0

ben.c
1 Июл 2020 в 11:54

SQLSTATE[42000]: Syntax error or access violation: 1064 sphinxql: syntax error, unexpected QUOTED_STRING, expecting CONST_INT or CONST_FLOAT or ‘-‘ near »58e7208978321a11f339cbb2»
The SQL being executed was: SELECT * FROM `real_index` WHERE `product_id`=’58e7208978321a11f339cbb2»

вроде в конфиге product_id указан как строка, а он требует чтобы был числом , что не так?

Выборка делается так

$product = (new Query())->select('*')
            ->from('real_index')
            ->andWhere(['product_id' => (string)$model->_id])
            ->one();

p.s При вставке любого поля в andWhere будет аналогичная ошиба

конфиг sphinx

index real_index
{
    type = rt
    path = /var/sphinx/real_index_rt

    rt_field = key
    rt_field = product_id
    rt_field = product_name
    rt_field = description
    rt_field = company
    rt_attr_string = key
    rt_attr_string = product_id 
    rt_attr_string = product_name
    rt_attr_string = description

    charset_table = 0..9, A..Z->a..z, _, a..z, 
            U+410..U+42F->U+430..U+44F, U+430..U+44F, 
            U+5d0..U+5ea, U+5f0..U+5f2, 
            U+621..U+63a, U+640..U+64a, U+66e..U+66f, U+671..U+6d3, U+6d5, 
            U+6e5..U+6e6, U+6ee..U+6ef, U+6fa..U+6fc, U+6ff, 
            U+e01..U+e30, U+e32..U+e33, U+e40..U+e46

    morphology = stem_enru
    rt_mem_limit = 1024M
}

index real_category_index
{
    type = rt
    path = /var/sphinx/real_category_index_rt

    rt_field = category_id
    rt_field = category_name
    rt_attr_string = category_id
    rt_attr_string = category_name

    charset_table = 0..9, A..Z->a..z, _, a..z, 
            U+410..U+42F->U+430..U+44F, U+430..U+44F, 
            U+5d0..U+5ea, U+5f0..U+5f2, 
            U+621..U+63a, U+640..U+64a, U+66e..U+66f, U+671..U+6d3, U+6d5, 
            U+6e5..U+6e6, U+6ee..U+6ef, U+6fa..U+6fc, U+6ff, 
            U+e01..U+e30, U+e32..U+e33, U+e40..U+e46

    morphology = stem_enru
    rt_mem_limit = 1024M
}

index real_location_index
{
    type = rt
    path = /var/sphinx/real_location_index_rt

    rt_field = location_id
    rt_field = location_name
    rt_attr_string = location_id
    rt_attr_string = location_name

    charset_table = 0..9, A..Z->a..z, _, a..z, 
            U+410..U+42F->U+430..U+44F, U+430..U+44F, 
            U+5d0..U+5ea, U+5f0..U+5f2, 
            U+621..U+63a, U+640..U+64a, U+66e..U+66f, U+671..U+6d3, U+6d5, 
            U+6e5..U+6e6, U+6ee..U+6ef, U+6fa..U+6fc, U+6ff, 
            U+e01..U+e30, U+e32..U+e33, U+e40..U+e46

    morphology = stem_enru
    rt_mem_limit = 1024M
}


searchd
{
    listen              = 9312:mysql41
    log                 = /var/log/sphinxsearch/searchd.log
    query_log           = /var/log/sphinxsearch/query.log
    pid_file            = /run/sphinxsearch/searchd.pid
    max_children        = 10
    read_timeout        = 10
    workers             = threads
    binlog_path         = /var/log/sphinxsearch
    rt_flush_period     = 3600
    expansion_limit     = 540
compat_sphinxql_magics = 0

}

indexer
{
    mem_limit = 256M
}

SQL Server 2014 Developer — duplicate (do not use) SQL Server 2014 Enterprise — duplicate (do not use) SQL Server 2014 Standard — duplicate (do not use) Еще…Меньше

Проблемы

При выполнении инструкции INSERT, UPDATE или MERGE в представлении, которое определено с помощью синтаксиса WITH CHECK, создается файл дампа, и Microsoft SQL Server регистрирует следующие сообщения об ошибках в журнале приложений:

<timestamp> Server: запрос пользователя из сеанса с SPID < # > создал неустранимое исключение. SQL Server завершает этот сеанс. Обращение в службу технической поддержки с помощью дампа, созданного в каталоге журналов…. <timestamp> SPID< # > SqlDumpExceptionHandler: процесс < # > сгенерировано неустранимое исключение c0000005 EXCEPTION_ACCESS_VIOLATION. Сервер SQL Server завершает этот процесс

Решение

Совокупные сведения об обновлениях

Эта проблема впервые устранена в следующем накопительном обновлении SQL Server.

  • Накопительное обновление 4 для SQL Server 2014 с пакетом обновления 1 (SP1)

Дополнительная информация

Эта проблема возникает только при выполнении инструкций INSERT, UPDATE и MERGE в представлении, определенном с помощью синтаксиса WITH CHECK OPTION. Пример:

UPDATE "<ViewName>" SET"<ColumnA>" = <NewValue> WHERE ("<ColumnB>" = <ColumnBValue>)

Обходное решение

  • Выполняйте инструкции INSERT, UPDATE и MERGE с таблицами, которые являются основными для представлений, определенных с помощью синтаксиса WITH CHECK OPTION.

  • Измените или повторно создайте соответствующие представления, чтобы убедиться в том, что параметр WITH CHECK не используется.

Статус

Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе «Применяется к».

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.

I’ve looked through all the other StackOverflow (and google) posts with the same problem, but none seemed to address my problem.

I am using PDO and PHP.

My code:

$vals = array(
   ':from'    => $email,
   ':to'      => $recipient,
   ':name'    => $name,
   ':subject' => $subject,
   ':message' = >$message
);
print_r($vals);
try {
   $pdo = new PDOConfig();
   $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   $sql = "SELECT * FROM messages WHERE `message` LIKE :message";
   $q = $pdo->prepare($sql);
   $q->execute(array(':message' => $vals[':message']));
   $resp = $q->fetchAll();

   foreach ($resp as $row) {
      throw new Exception('Please do not post the same message twice!');
   }

   $sql = "INSERT INTO messages (from, to, name, subject, message) VALUES (:from, :to, :name, :subject, :message)";
   $q = $pdo->prepare($sql);
   $q->execute($vals);
} 
catch(PDOException $e) {
   echo $e->getMessage();
}

and the first print_r gives

Array ( [:from]    => abc@gmail.com 
        [:to]      => lala@me.com 
        [:name]    => abc 
        [:subject] => abc 
        [:message] => abc )

which is expected (none are null)

but it outputs the error

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘from, to, name, subject, message) VALUES (‘abc@gmail.com’, ‘lala@me.com’ at line 1

No idea how to fix this. any ideas?

Я пытаюсь создать подготовленный оператор с использованием PDO, который позволит мне создавать пользователей mysql, используя данные, собранные из формы. Когда я запускаю команду, я получаю ошибку:

SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии сервера MySQL, для правильного синтаксиса для использования рядом с » select ‘ON’ testjoke.authors ‘to’ corey ‘@’ localhost » в строке 1

  • Попытка заставить INSERT вставлять только новые данные
  • PDO Возврат всех строк
  • Можете ли вы использовать именованные параметры в Laravel Rloquent
  • Запрашивать фактический SQL-запрос с помощью ActiveRecord с Yii2?
  • Мой код регистрации Sql не работает

В настоящее время я просто использую данные из некоторых переменных, которые я создал для тестирования, вместо данных из формы. Код выглядит так:

$grantQuery = $db->prepare("GRANT ? ON ? TO ?@'localhost';"); $select = 'select'; $testjoke = 'testjoke.authors'; $pdoemail = 'corey'; $grantQuery ->execute(array( $select, $testjoke, $pdoemail )); 

Я включил общий журнал Mysql, и запрос никогда не появляется на нем (никогда не исполнялся).

Я пытаюсь найти исправление для этого на пару дней, но мне не повезло.

  • Обработка сложных предложений WHERE с помощью PHP Query Builder
  • Как предотвратить атаку SQL Injection в приложениях, запрограммированных в Zend Framework?
  • Наилучшая практика MySQL: дети SELECT рекурсивны, насколько это возможно?
  • Как сохранить номер версии в базе данных MySQL
  • Как превратить строки MySQL в эквиваленты SQL Server

Любая помощь будет принята с благодарностью.

Благодаря Corey

Related of «SQLSTATE : ошибка синтаксиса или нарушение доступа – подготовленный отчет PDO «GRANT»»

Как вы не можете написать SELECT ? FROM ? SELECT ? FROM ? , вы также не можете разделить GRANT на подготовленный запрос.

Подготовленные значения запроса могут быть только значениями. Из соображений безопасности среди многих других вы не можете передавать ключевые слова. Единственным параметром, который может работать в вашем случае, является имя пользователя, так как это строка.

PDO пытается запустить:

 GRANT 'select' ON 'testjoke.authors' TO 'cory':'localhost'; 

Вы можете понять, почему это не сработает, надеюсь.

Вопрос:

Я переношу свои локальные файлы в Интернете и имею проблемы с PHP с моим db script. Работает нормально локально (работает PHP 5.3.8), но дает мне следующие ошибки на моем сервере (PHP 5.3.10)

Без $DBH- > setAttribute (PDO:: ATTR_ERRMODE, PDO:: ERRMODE_EXCEPTION);

Неустранимая ошибка: вызов функции-члена setFetchMode() для не-объекта в /…/…php в строке 108

С $DBH- > setAttribute (PDO:: ATTR_ERRMODE, PDO:: ERRMODE_EXCEPTION);

SQLSTATE [42000]: ошибка синтаксиса или нарушение прав доступа: команда 1142 SELECT запрещена для пользователя ‘…’ @’205.186.180.26′ для приглашенной таблицы

Вот мой код:

class guest {
public $id;
public $guest_name;
public $url_phrase;
}

$guest = new guest;

if (isset($_GET['p'])) {
$url_phrase = urldecode($_GET['p']);
} else if (isset($_POST['p'])) {
$url_phrase = urldecode($_POST['p']);
}

if (isset($url_phrase)) {

try {

$DBH = new PDO("mysql:host=myhost.com;dbname=mydbname", "myusername", "mypassword");
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$url_phrase = $DBH->quote($url_phrase);
$sql = "SELECT id, guest_name, url_phrase FROM mydbname.invited WHERE url_phrase = $url_phrase";

$stmt = $DBH->query($sql);
$stmt->setFetchMode(PDO::FETCH_INTO, new guest);

$guestNumber = $stmt->rowCount();

if($guestNumber > 0) {
etc...
}
if($guestType == "solo") {
foreach($stmt as $guest) {
$name = $guest->guest_name;
etc...
}
}
} else {
other stuff.. etc..
$DBH = null;
} catch (PDOException $e) {
echo $e->getMessage();
}
}

У меня есть простые операторы выбора, чтобы нормально работать с этим пользователем (я не думаю, что это связано с разрешением), моя проблема, похоже, связана с моей реализацией PDO. Как я могу избавиться от этой ошибки? Подготавливаю/выполню выражение странным способом, который испортил это? Спасибо за любую помощь

Ответ №1

У меня была та же проблема. После того, как я загрузил свой код с локального на рабочий сервер, и у пользователя были все привилегии. Проблема была в имени базы данных – в моей локальной среде это было что-то вроде dattabase1, а в производстве имя было другим… prefix_ddatabas1. Я изменил имя базы данных на правильный, и все было в порядке.

Ответ №2

Звучит как проблема доступа на сервере:

SQLSTATE [42000]: Синтаксическая ошибка или нарушение доступа: 1142 Команда SELECT отказано пользователю ‘…’ @’205.186.180.26′ для приглашения таблицы ‘

Были ли вы протестированы из CLI (или какого-либо другого клиента sql за пределами PHP), чтобы обеспечить доступ к вашему script?

Вам, скорее всего, потребуется войти в db, чтобы предоставить доступ к пользователю, с которым работает ваш script, или проверить, что учетные данные, которые вы используете в script, точны для db в серверной среде.

Ответ №3

У меня была такая же проблема, код работал на dev-сервере, но не на prod-сервере, и работали другие скрипты, работающие с одной таблицей. Я пропустил исправление префиксов таблицы базы данных между средой разработчиков и prod. (имена базы данных не совпадают) ^^

Ответ №4

Я получил ту же ошибку. Имя разработчика было отличным от имени производственного БД, что вызвало эту ошибку. Я изменил имя db в моем коде на имя производственного БД, и оно сработало.

Спасибо

Ответ №5

У вас есть нарушение прав доступа:

Syntax error or access violation

Пользователь/хост, который вы используете:

1142 SELECT command denied to user '...'@'205.186.180.26'

не может выбрать из таблицы “приглашение”

  • Ошибка синтаксиса во введенном выражении аксесс
  • Ошибка синтаксиса во введенном выражении access введена запятая перед которой
  • Ошибка синтаксиса андроид apk
  • Ошибка синтаксиса create table sql
  • Ошибка синонимы к этому слову