За последние 24 часа нас посетил 20741 программист и 1117 роботов. Сейчас ищут 356 программистов ...

Проверка пользователя по базе данных

Тема в разделе "Прочие вопросы по PHP", создана пользователем Fyntik, 13 дек 2020.

Метки:
  1. Fyntik

    Fyntik Новичок

    С нами с:
    5 июн 2020
    Сообщения:
    38
    Симпатии:
    0
    Всем привет, у меня возникла проблема с этим кодом:

    Код (Text):
    1.         $proverka = mysqli_query($conDB, 'SELECT * FROM `buy` WHERE `name` = "'.$name.'" AND `data` = "n1"');
    2.         if(mysqli_num_rows($proverka) < 1) {
    3.             echo '<a>Купите N1 для покупки N2</a>';
    4.         }
    5.  
    6.         else {
    7.  
    8.         if ($groups != 'n2');
    9.         if ($price > 0) {
    10.             $url = 'https://выпилено.нафиг/pay/здесь есть ключ?sum='.$price.'&account='.$_POST['nickname'].'.'.$groups.'&signature='.getFormSignature(($_POST['nickname'].'.'.$groups), 'Покупка '.$name, $price, 'и здесь ключ').'&desc=Покупка '.$name;
    11.  
    12.             echo '<input type="submit" value="Купить за '.$price.' руб." class="btn bnt-new btn-lg btn-block">';
    13.         } else {
    14.             echo '<button type="submit" class="btn bnt-new btn-lg btn-block disabled">Слишком низкая цена</button>';
    15.             //header('Location: /');
    16.         }
    17.     }
    18. }
    При покупке у игрока должна выполняться проверка по нику, если он покупает привилегию N2, то для этого ему нужно купить привилегию N1, но почему-то все время показывает
    Код (Text):
    1.  
    2. Купите N1 для покупки N2
    А нужно чтобы если он не покупает привилегию N2 то ему просто пишет "купить за", а если покупает N2 и его нет в базе покупателей с такой группой, то ему должно писаться "Купите N1 для покупки N2"
     
    #1 Fyntik, 13 дек 2020
    Последнее редактирование модератором: 13 дек 2020
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Что ты хотел выразить вот этим запросом?
    Код (Text):
    1.  
    2. SELECT * FROM `buy` WHERE `name` = "'.$name.'" AND `data` = "n1"
    и чему равен $name? Не зная этого хз что тебе посоветовать. Я вижу косяки по коду, но давай сначала в логику нырнём.
     
  3. Fyntik

    Fyntik Новичок

    С нами с:
    5 июн 2020
    Сообщения:
    38
    Симпатии:
    0
    Вот весь код
    $name = ник игрока вводимый в строку при покупке привилегии
    Если игрок до этого покупал HYDRA то он может покупать OVERLORD
    Но если нет, то не может и ему пишет типо купите
    Все эти данные есть в бд
    Код (Text):
    1.  
    2. <?php
    3. include "../lib/configbg.php";
    4.  
    5. if (isset($_POST['group']) && isset($_POST['nickname']) && $_POST['nickname'] != '' && isset($_REQUEST['checkprice'])) {
    6.  
    7.     $promo = 0;
    8.     if (isset($_POST['promocode'])) {
    9.         $promos = mysqli_query($conDB, 'SELECT * FROM `promo` WHERE `promo`="'.$_POST['promocode'].'"');
    10.         while ($p = mysqli_fetch_assoc($promos)) {
    11.             $promo = $p['sale'];
    12.         }
    13.     }
    14.  
    15.     if (isset($_POST['group'])) {
    16.  
    17.         $groups = $_POST['group'];
    18.  
    19.         $adds = mysqli_query($conDB, 'SELECT * FROM `donate` WHERE `group`="'.$groups.'"');
    20.         while ($row = mysqli_fetch_assoc($adds)) {
    21.             $type = $row['type'];
    22.             $price = $row['price'];
    23.             $name = $row['name'];
    24.  
    25.             if ($type == 'perm') {
    26.                 $sumAdds = mysqli_query($conDB, 'SELECT * FROM `buy` WHERE `type`="perm" AND `name`="'.$_POST['nickname'].'"');
    27.                 while ($rowSum = mysqli_fetch_assoc($sumAdds)) {
    28.                     $price = $row['price'];
    29.                     $price = $row['price'] - $rowSum['sum'];
    30.  
    31.                     if ($price < 1) { $price = $row['price']; }
    32.                 }
    33.             }
    34.         }
    35.      
    36.         if ($promo != 0) {
    37.             $price = $price - (($promo * $price) / 100);
    38.         }
    39.  
    40.         $proverka = mysqli_query($conDB, 'SELECT * FROM `buy` WHERE `name` = "'.$name.'" AND `data` = "hydra"');
    41.         if(mysqli_num_rows($proverka) < 1) {
    42.             echo '<a>Приобретите HYDRA для покупки OVERLORD</a>';
    43.         }
    44.  
    45.         else {
    46.         if($groups != 'overlord');
    47.         if($price > 0) {
    48.             $url = 'https://выпилено.нафиг/pay/ключ?sum='.$price.'&account='.$_POST['nickname'].'.'.$groups.'&signature='.getFormSignature(($_POST['nickname'].'.'.$groups), 'Покупка '.$name, $price, 'ключ2').'&desc=Покупка '.$name;
    49.  
    50.             echo '<input type="submit" value="Купить за '.$price.' руб." class="btn bnt-new btn-lg btn-block">';
    51.         } else {
    52.             echo '<button type="submit" class="btn bnt-new btn-lg btn-block disabled">Слишком низкая цена</button>';
    53.             //header('Location: /');
    54.         }
    55.     }
    56. }
    57.  
    58. } else {
    59.     //echo '<button type="submit" class="btn bnt-new btn-lg btn-block disabled">Заполните данные</button>';
    60.     //echo '<button type="submit" class="btn bnt-new btn-lg btn-block disabled">'.$_POST['checkprice'].'</button>';
    61.     //header('Location: /');
    62.  
    63.     $promo = 0;
    64.     if (isset($_POST['promocode'])) {
    65.         $promos = mysqli_query($conDB, 'SELECT * FROM `promo` WHERE `promo`="'.$_POST['promocode'].'"');
    66.         while ($p = mysqli_fetch_assoc($promos)) {
    67.             $promo = $p['sale'];
    68.         }
    69.     }
    70.  
    71.     if (isset($_POST['groupsoup'])) {
    72.  
    73.         $groups = $_POST['group'];
    74.  
    75.         $adds = mysqli_query($conDB, 'SELECT * FROM `donate` WHERE `group`="'.$groups.'"');
    76.         while ($row = mysqli_fetch_assoc($adds)) {
    77.             $type = $row['type'];
    78.             $price = $row['price'];
    79.             $name = $row['name'];
    80.  
    81.             if ($type == 'perm') {
    82.                 $sumAdds = mysqli_query($conDB, 'SELECT * FROM `buy` WHERE `type`="perm" AND `name`="'.$_POST['nickname'].'"');
    83.                 while ($rowSum = mysqli_fetch_assoc($sumAdds)) {
    84.                     $price = $row['price'];
    85.                     $price = $row['price'] - $rowSum['sum'];
    86.  
    87.                     if ($price < 1) { $price = $row['price']; }
    88.                 }
    89.             }
    90.         }
    91.      
    92.         if ($promo != 0) {
    93.             $price = $price - (($promo * $price) / 100);
    94.         }
    95.  
    96.         if ($price > 0) {
    97.             header('Location: https://выпилено.нафиг/pay/ключ1?sum='.$price.'&account='.$_POST['nickname'].'.'.$groups.'&signature='.getFormSignature(($_POST['nickname'].'.'.$groups), 'Покупка "'.$name.'"', $price, 'ключ2').'&desc=Покупка "'.$name.'"');
    98.         } else {
    99.             header('Location: /');
    100.         }
    101.     }
    102. }
    103.  
    104. function getFormSignature($account, $desc, $sum, $secretKey) {
    105.     $hashStr = $account.'{up}'.$desc.'{up}'.$sum.'{up}'.$secretKey;
    106.     return hash('sha256', $hashStr);
    107. }
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Если я понял правильно, то твой запрос вызывается N раз в цикле. Переменная $name ищется в цикле. И если есть кто-то, не обязательно текущий пользователь, кто как-то относится к группе из $_POST['group'] и хотябы раз покупал 'hydra', то ты возможно увидишь ссылку на покупку 'overloard'. $name при выходе из цикла содержит имя из последней найденной записи. Последней из нескольких. Ведь там же цикл, Карл! Логика странная.

    Попутно косяки:
    - твоя $name может быть пустой, если в цикле не оказалось записей. Этот случай потенциально может привести к ошибке undefined variable, а может без ошибки интерпретироваться как пустая строка и тоже привести к неожиданному результату. сделай так, чтобы если ничего не найдено для $name, то и ничего дальше не проверялось. выпрямляй логику!

    - считать количество записей в таблице, удовлетворяющих условие надо через SELECT COUNT(*), а не через mysqli_num_rows().

    - строковые литералы в sql надо окружать одинарными кавычками. Лучше используй двойные кавычки чтобы окружить весь текст запроса, а внутри его везде одинарные.

    - никогда не подставляй значения из $_POST или $_GET просто как WHERE `group`='".$groups."', это уязвимость. используй подготовленные выражения.
     
  5. Fyntik

    Fyntik Новичок

    С нами с:
    5 июн 2020
    Сообщения:
    38
    Симпатии:
    0
    Как сделать чтобы нормально заработал скрипт?
    Где ошибка?
    Почему высвечивает только Купите HYDRA...?
    Помогите пожалуйста
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Ты ведь не хочешь чтобы я написал за тебя код?
    Я написал где ошибка.
     
  7. Fyntik

    Fyntik Новичок

    С нами с:
    5 июн 2020
    Сообщения:
    38
    Симпатии:
    0
    Ошибка в mysqli
    _num_rows?
    Её нужно заменить на SELECT COUNT(*) ?
    Если да, то как?
    Как я понял, то нужно вместо SELECT *
    Код (Text):
    1.  
    2.         $proverka = mysqli_query($conDB, 'SELECT COUNT()* FROM `buy` WHERE `name` = "'.$name.'" AND `data` = "hydra"');
    3.         if(mysqli_num_rows($proverka) < 1) {
    4.             echo '<a>Купите HYDRA для покупки OVERLORD</a>';
    5.         }
    Что делать с mysqli_num_rows?
    --- Добавлено ---
    Код (Text):
    1.         $proverka = mysqli_query($conDB, 'SELECT COUNT()* FROM `buy` WHERE `name` = "'.$name.'" AND `data` = "hydra"');
    2.         $rowsone = mysql_fetch_row($proverka)
    3.         $totals = $row[0] {
    4.             echo '<a>Купите HYDRA для покупки OVERLORD</a>';
    5.         }
    так?
     
  8. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    что у тебя на 49 строке (модератор: в этой теме это строка 40) в $name? завардампи, проверь. Мне кажется $proverka у тебя пустая получается
     
    #8 Taktreba, 14 дек 2020
    Последнее редактирование модератором: 14 дек 2020