Как устранить ошибку «Duplicate Entry» в MySQLi - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь выполнить базовый c MySQL запрос. Но когда я запускаю свой код, он не проверяет должным образом, существует ли запись с таким именем.

Вот мой код:

            $loggedinUserID = $_SESSION['user'];
            $loggedinUserName = $_SESSION['name'];

            //check if user is logged in
            if(empty($loggedinUserID)) {header('Location: ../');}

            $servername = "localhost";
            $username = "{hidden}";
            $password = "{hidden}";

            // Create connection
            $conn = mysqli_connect($servername, $username, $password, '{hidden}');

            // Check connection
            if (!$conn) {
               die("Connection failed: " . mysqli_connect_error());
            }

            $sql = "SELECT accessId FROM users WHERE userId=$loggedinUserID";
            $final = mysqli_query($conn, $sql);
            $result = mysqli_fetch_assoc($final);
            echo $result;

            if(empty($result)) {
                $sql2 = "INSERT INTO users (`userId`, `userName`, `accessId`) VALUES ('$loggedinUserID', '$loggedinUserName', '0')";
                if(mysqli_query($conn, $sql2)) {
                    echo "Your account was created successfully, however you have not been permitted access. Please contact system admins to be granted access.";
                }
                else {
                    echo "An error occured when creating your account. --->" . mysqli_error($conn);
                }
            }

При этом возвращается ошибка An error occured when creating your account. --->Duplicate entry '2147483647' for key 'userId'.

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

Ответы [ 2 ]

2 голосов
/ 17 апреля 2020

Сообщаемое повторяющееся значение 2147483647 также может быть выражено как 2 ^ 31-1, что также является максимальным значением, которое может быть сохранено с помощью 32-разрядного целого числа со знаком INT типа в MySQL.

Я подозреваю, что тип данных столбца userid - это INT (только предположения), и я подозреваю, что оператор INSERT пытается предоставить значение, большее, чем может быть сохранено в INT типе данных. Поведение MySQL состоит в том, чтобы выдавать предупреждение и урезать значение до максимального значения, которое может быть сохранено, и разрешить выполнение инструкции.

Я ожидаю, что мы получим другую ошибку с другим значением sql_mode возвращать ошибку усечения данных, а не предупреждение об усечении данных.

Обратите внимание, что SELECT не будет выдавать предупреждение или ошибку, проверяя наличие строки. Это просто не собирается возвращать строку.

Для отладки рассмотрите echo / printf / vardump значения, включенного в текст SQL. (Также рассмотрите возможность использования подготовленного оператора с заполнителями связывания как способ смягчения SQL уязвимостей внедрения.)


В качестве демонстрации поведения, которое мы наблюдаем в MySQL со значениями, которые больше, чем можно сохранить в INT, рассмотрим:

USE test ;
CREATE TABLE foo (id INT PRIMARY KEY) ;
-- # 0 row(s) affected

INSERT INTO foo (id) VALUES (2147483648) ;
-- # 1 row(s) affected, 1 warning(s)
-- # Warning Code : 1264
-- # Out of range value for column 'id' at row 1

SELECT id FROM foo ;
-- #          id
-- # -----------
-- #  2147483647

SELECT id FROM foo WHERE id = 2147483649 ;
-- # 0 row(s)

INSERT INTO foo (id) VALUES (2147483649) ;
-- # Error Code: 1062
-- # Duplicate entry '2147483647' for key 'PRIMARY'

DROP TABLE foo ;
-- # 0 row(s) affected
0 голосов
/ 17 апреля 2020

'2147483647' - максимальное значение для int. Вам нужно изменить столбец userId на bigint.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...