INSERT INTO не заполняет все строки

У меня проблема с моим кодом, это экспресс-интеграция PayPal. Я имею в виду, что в исходном состоянии после некоторой настройки, чтобы она соответствовала моей базе данных, и так далее, она работает, она заполняет строки ex. идентификатор плательщика и так далее.

У меня есть в моей базе данных 2 таблицы: первая — это «Продукты», в ней 5 строк, таких как productID, «Цена», «валюта» и т. д., но мне нужна 1 дополнительная строка — скажем, мы назовем ее «Кредиты». Я вручную добавил его в свою базу данных, заполнил Table Products данными.

Затем у меня есть еще одна таблица под названием «Заказы», ​​где я также добавил строку с названием «Кредиты», после чего после успешной оплаты + проверки сопоставили кредиты с выбранным продуктом, он должен заполнить эту строку «Кредиты в таблице заказов». Проблема в том, что у меня есть таблица заказов, заполненная всеми данными, кроме последней строки -> Кредиты, в базе данных всегда отображается NULL.

Это часть моего кода:

    public function getAllProducts()
    {
        $db = getDB();
        $stmt = $db->prepare("SELECT * FROM products");
        $stmt->bindParam("pid", $pid, PDO::PARAM_INT) ;
        $stmt->execute();
        $data = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db=null;
        return $data;

    }

    public function getProduct($pid)
    {
        $db = getDB();
        $stmt = $db->prepare("SELECT * FROM products WHERE pid=:pid");
        $stmt->bindParam("pid", $pid, PDO::PARAM_INT) ;
        $stmt->execute();
        $data = $stmt->fetch(PDO::FETCH_OBJ);
        $db=null;
        return $data;

    }

а вот у меня проблема

    public function orders()
    {
        $id = $_SESSION['session_id'];
        $db = getDB();
        $stmt = $db->prepare("SELECT P.product, P.price, P.product_img, P.currency, P.credits, O.created, O.oid  FROM orders O, products P WHERE O.id_fk=:id AND P.pid = O.pid_fk ORDER BY O.created DESC");
        $stmt->bindParam("id", $id, PDO::PARAM_INT) ;
        $stmt->execute();
        $data = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db=null;
        return $data;

    }

    public function updateOrder($pid, $payerID, $paymentID, $token, $credits)
    {
        $id = $_SESSION['session_id'];
        if ($this->pyamentCheck($paymentID) < 1 && $id > 0){
        $db = getDB();

        $stmt = $db->prepare("INSERT INTO orders (id_fk, pid_fk, payerID, paymentID, token, created, credits) VALUES (:id, :pid, :payerID, :paymentID, :token, :created, :credits)");
        $stmt->bindParam("paymentID", $paymentID, PDO::PARAM_STR) ;
        $stmt->bindParam("payerID", $payerID, PDO::PARAM_STR) ;
        $stmt->bindParam("token", $token, PDO::PARAM_STR) ;
        $stmt->bindParam("pid", $pid, PDO::PARAM_INT) ;
        $stmt->bindParam("id", $id, PDO::PARAM_INT) ;
        $created = time();
        $stmt->bindParam("created", $created, PDO::PARAM_INT) ;
        $stmt->bindParam(":credits", $credits, PDO::PARAM_INT) ;

        $stmt->execute();
        $db=null;
        return true;

        }
        else{
            return false;
        }

    }

Я не могу понять это.

$stmt = $db->prepare("SELECT * FROM products"); не имеет заполнителя, так что теперь это тоже должно работать.
user3783243 01.05.2019 18:26

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

user3783243 01.05.2019 18:31

Вы пытались добавить точку с запятой (:) перед именем столбца в bindParam?

danish-khan-I 01.05.2019 18:51

да делал, тот же результат

Kamil Wisniewski 01.05.2019 18:54

Это PDO или MySQLi? Вряд ли и то, и другое. Вы бы удалили один из этих тегов?

halfer 04.05.2019 14:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Таким образом, проблема не в PDO, не в подготовленных операторах и не в базе данных, а просто в вашей исходной переменной $credits. Вы должны проверить свой код, связанный с этой переменной, и убедиться, что он содержит желаемое значение.

->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); не показывает никаких ошибок, я попытался изменить кодовое имя таблицы, а затем выдает ошибку исключения, когда я ввожу правильное имя таблицы, она ничего не показывает, я имею в виду, нет ошибки. Тем не менее в БД последняя строка равна NULL

Kamil Wisniewski 01.05.2019 19:01

@KamilWisniewski Может быть, дать $credits значение по умолчанию в определении вашей функции, $credits = 0) или отладить, где вы вызываете функцию и какая там переменная.

user3783243 01.05.2019 19:28

Может я не всю информацию написал. Я не могу указать $ Credit = 0, 100 или 1000, потому что это экспресс-оплата PayPal. Если пользователь выбирает напр. Продукт 1 имеет в БД количество кредитов 100, если он выбирает продукт 2, он имеет 200 и так далее. Поэтому после того, как он выбирает продукт, он перенаправляется на страницу оплаты PayPal с идентификатором session_id и pid-> product id. Когда он закончит оплату, он должен получить эти кредиты со ссылкой на эту сессию и pid. Вся информация заполняется в таблицы заказов в БД, за исключением этой дополнительной кредитов. В таблице «Продукты» я заполнил строку «Кредиты» суммами. Он по-прежнему заполняет последнее значение NULL в таблице заказов.

Kamil Wisniewski 01.05.2019 20:31

@KamilWisniewski, вам следует продолжить работу над своим кодом. Это, собственно, то, что делают все программисты. Мы мало чем можем вам помочь, не имея ни вашего кода, ни вашей базы данных, ни вашей учетной записи PayPal. Вы получили ответ на вопрос, почему столбец Credits (кстати, он называется столбцом, а не строкой) имеет значение null. Ваша задача выяснить, почему ваша переменная $credits равна нулю.

Your Common Sense 01.05.2019 20:35

Другие вопросы по теме