• Подготовленные запросы, как сократить код?

    @hooligan377 Автор вопроса
    Adamos, Ну не по два запроса. Там работа как с постом написанным в определенный раздел и комментарии к нему, две разные таблицы..
  • Подготовленные запросы, как сократить код?

    @hooligan377 Автор вопроса
    Дмитрий, Да, работаю над темами на форуме.

    Код на самом деле не очень читабельный, процедурка да и опыта маловато.

    include '../system/base.php';
    include '../system/function.php';
    
    auth(); // Закроем от неавторизированых
    
    $id = intval(trim($_GET['id']));
    
    $stmt = $base->prepare("SELECT * FROM `forum_topic` WHERE id = ?");
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $topic = $stmt->get_result()->fetch_assoc();
    
    $stmt = $base->prepare("SELECT * FROM `profile` WHERE id = ?");
    
    
    $title = $topic['name'];
    include '../system/header.php';
    
    $reply = intval(trim($_GET['reply']));
    
    if($reply) {
    	
    $stmt->bind_param("i", $reply);
    $stmt->execute();
    $_reply = $stmt->get_result()->fetch_assoc();
    
    
    if(!$_reply['id'] OR $_reply['id'] == $profile['id']) {
      
        header('location: /forum/t-'.$topic['id'].'/');
        
      exit();
      
    }
    
    $stmt->close();
    }
    
    if(!$topic){
    $stmt = $base->prepare("INSERT INTO log (uid, self, url, time) VALUES (?, ?, ?, ?)");
    $stmt->bind_param('issi', $profile['id'], $_SERVER['PHP_SELF'], $_SERVER['REQUEST_URI'],  $time);
    $stmt->execute();
    $stmt->close();
    
        header('Location: /forum'); exit();
    }
    
    $stmt->bind_param("i", $topic['uid']);
    $stmt->execute();
    $result = $stmt->get_result()->fetch_assoc();
    
    echo '<div class="block">';
    
    echo '<div style="padding: 10px;">';
    echo 'Автор: <a href="/profile/'.$result['id'].'" style="font-weight: bold">'.$result['login'].'</a> <span style="float: right;">'.timestep($topic['time']).'</span>';
    echo '</div>';
    echo '<div class="link-line"></div>';
    
    echo '<div style="padding: 10px;">'.$topic['text'].'</div>';
    
    $stmt = $base->prepare("SELECT * FROM `forum_comment` WHERE topic = ?");
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $data = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
    
    
    echo '<div class="link-line"></div>';
    
    foreach ($data as $comment) {
    $stmt = $base->prepare("SELECT * FROM `profile` WHERE id = ?");
    $stmt->bind_param("i", $comment['uid']);
    $stmt->execute();
    $res = $stmt->get_result()->fetch_assoc();
    
    	
    echo '<a href="/profile/'.$res['id'].'/" style="font-weight: bold">'.$res['login'].'</a>';
    echo ''.($comment['uid'] == $profile['id'] ? ': ' : '<a href="/forum/t-'.$topic['id'].'?reply='.$comment['uid'].'">(&raquo;)</a>: ').'';
    echo ''.$comment['text'].'';
    echo '<div class="link-line"></div>';
    
    }
    
    if($topic['status'] == 'open'){
    
    if(isset($_REQUEST['ok'])){
    
    $text = trim(filter_input(INPUT_POST, 'text', FILTER_SANITIZE_STRING));
    
    if(empty($text)) msg('Введите сообщение');
    elseif(!preg_match("#[a-zа-я0-9]+#ui", $text)) msg('В тексте могут содержаться только буквы и цифры');
    elseif(mb_strlen($text) > 1199 or mb_strlen($login) < 5) msg('Количество символов от 5 до 3000');
    else{
    
    $stmt = $base->prepare("INSERT INTO forum_comment (uid, topic, reply, text, time) VALUES (?, ?, ?, ?, ?)");
    $stmt->bind_param('iiisi', $profile['id'], $topic['id'], $reply, $text, $time);
    $stmt->execute();
    $stmt->close();
    
    header('Location: /forum/t-'.$topic['id'].'/');
    
    }
    }
    	
    echo '<div class="content" align="center">';
    echo '<form active="" method="post">
            
            <textarea class="forum" name="text">'.($reply == '0' ? '' : ''.$_reply['login'].', ').'</textarea>
            <button name="ok" class="sub" >Отправить</button>
    
    </form>';
    echo '</div><div class="link-line"></div>';
    }else{
    	echo '<div class="content" align="center" style="color: red; font-weight: bold">Тема закрыта...</div>';
    }
    
    echo '<div style="padding: 15px;">';
    echo '<a href="/forum/'.$topic['section'].'/" class="pages" style="padding: 5px;"> Назад</a> ';
    echo '<a href="/forum/moder/t-'.$topic['id'].'/" class="pages" style="padding: 5px;"> Пожаловаться</a>';
    echo '</div>';
    
    echo '</div>';
    include '../system/footer.php';
  • Подготовленные запросы, как сократить код?

    @hooligan377 Автор вопроса
    Дмитрий, По тому что есть обертки, я уже понимаю что сократить код возможно. Нашел данный класс, а теперь возникает вопрос. По идее классы подключаются в скрипте в определенное место, искал как подключить класс нахожу только информацию о дочерних классах и подключение стандартным include.. Так ли это?
  • Подготовленные запросы, как сократить код?

    @hooligan377 Автор вопроса
    Дмитрий, Думаю нет, сложно пока что)) Совсем недавно только перешел на mysqli и начал работать с подготовленными запросами. И все спасибо людям с тостера иначе бы сам ничего не понял бы.

    А в данный момент, мне интересно возможно ли как то сократить код и что бы все работало корректно.
  • Подготовленные запросы, как сократить код?

    @hooligan377 Автор вопроса
    Дмитрий, Я на просторах нашел довольно интересный класс пдо, но не уверен в его безопасности.

    class MyPDO extends PDO
        {
            public function run($sql, $args = NULL)
        {
                $stmt = $this->prepare($sql);
                $stmt->execute($args);
                return $stmt;
            }
        }
    
    $data = $pdo->run("SELECT * FROM users WHERE sex='male'")->fetchAll();


    Что скажете на счет него?
  • SQL инъекция или можно?

    @hooligan377 Автор вопроса
    sim3x, Хорошо, учту, огромное вам спасибо)
  • SQL инъекция или можно?

    @hooligan377 Автор вопроса
    sim3x, Огромное вам спасибо)
  • SQL инъекция или можно?

    @hooligan377 Автор вопроса
    sim3x, думаю меня простят за невнимательность, нашел косяк более углубившись в первый вариант с подготовленным запросом, ошибка простого синтаксиса, в место DESC писал DESK и постоянно получал ошибку синтаксиса из-за чего и отсеил этот вариант первоначально. Дико извиняюсь за ваше потраченное время.
  • SQL инъекция или можно?

    @hooligan377 Автор вопроса
    sim3x, Если он захочется, то сделаю я примерно таким образом:

    В начале я создам файл конфигурации (типа с настройками) setting.php (помещу его в папку profile) и буду там собирать данные хотелок пользователей. Но при этом я буду использовать подготовленный запрос.

    А в данном коде, я изменю всего 1 строку, поменяю $max = 10 на $max = $p_setting['page_max'], то есть в принципе все решаемо...

    или я в чем то не прав?

    Вообще отклонились от темы.. В данном коде, есть или нету sql инъекции? Могу я им безопасно пользоваться или лучше не стоит?
  • SQL инъекция или можно?

    @hooligan377 Автор вопроса
    sim3x, А var_dump делал, выводит он следующее:

    array(5) { [0]=> array(5) { ["id"]=> int(1) ["uid"]=> int(20) ["tid"]=> int(20) ["text"]=> string(6) "sadasd" ["time"]=> int(1550745018) } [1]=> array(5) { ["id"]=> int(2) ["uid"]=> int(20) ["tid"]=> int(20) ["text"]=> string(6) "sadasd" ["time"]=> int(1550745081) } [2]=> array(5) { ["id"]=> int(3) ["uid"]=> int(20) ["tid"]=> int(20) ["text"]=> string(8) "sasadasd" ["time"]=> int(1550745090) } [3]=> array(5) { ["id"]=> int(4) ["uid"]=> int(20) ["tid"]=> int(20) ["text"]=> string(8) "sasadasd" ["time"]=> int(1550745130) } [4]=> array(5) { ["id"]=> int(5) ["uid"]=> int(20) ["tid"]=> int(20) ["text"]=> string(8) "sasadasd" ["time"]=> int(1550745161) } }
  • SQL инъекция или можно?

    @hooligan377 Автор вопроса
    sim3x, переменную $max определяю я, еще в начале скрипта, это количество записей на странице. То есть, пользователь не имеет возможности ее изменения и соответственно не доберется для залития инъекции. Тоже самое и с переменно $start

    Вот он весь кусок кода:

    $max = 10;
    $count = mysqli_num_rows(mysqli_query($base, 'SELECT COUNT(*) FROM `chat`'));
    $pages = ceil($count/$max);
    $page = filter_var(trim($_GET['page'], FILTER_SANITIZE_NUMBER_INT));
    
    if($page > $pages) {$page = $pages;}
    if($page < 1) {$page = 1;}
        
      $start = $page * $max - $max;
    
    $q = mysqli_query($base, "SELECT * FROM `chat` ORDER BY `id` DESC LIMIT $start, $max");
    
    echo '<div class="block">';
    
    if($count){
    while ($row = mysqli_fetch_array($q)) {
    	$sql = mysqli_query($base, "SELECT * FROM `profile` WHERE`id` = $row[uid]");
    	$fetch = mysqli_fetch_array($sql);
    echo '<div style="padding: 5px">';
    echo ''.$fetch['login'].' |'.filter_db_text($row['text']).'';
    echo '</div>';
    echo '<div class="link-line"></div>';
    
    }}else{
    	echo '<div class="gl-obv">Сообщений нет</div>';
    }
  • SQL инъекция или можно?

    @hooligan377 Автор вопроса
    sim3x, Да проблемка просто с этим кодом...

    Подсказали мне вот такой вариант работы в цикле при помощи подготовленного запроса:

    $stmt = $base->prepare("SELECT * FROM `chat` ORDER BY id LIMIT 5");
    $stmt->execute();
    $data = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
    
    foreach ($data as $row) {
        echo $row['das'];
    }


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

    А вот если работать с таким кодом:

    // Переменные $start и $max используются, определяются выше (в ненужном здесь куске кода)
    $q = mysqli_query($base, "SELECT * FROM `chat` ORDER BY `id` DESC LIMIT $start, $max");
    
    echo '<div class="block">';
    
    if($count){
    while ($row = mysqli_fetch_array($q)) {
    	$sql = mysqli_query($base, "SELECT * FROM `profile` WHERE`id` = $row[uid]");
    	$fetch = mysqli_fetch_array($sql);
    echo '<div style="padding: 5px">';
    echo ''.$fetch['login'].' |'.filter_db_text($row['text']).'';
    echo '</div>';
    echo '<div class="link-line"></div>';
    
    }}else{
    	echo '<div class="gl-obv">Сообщений нет</div>';
    }


    То в моем варианте, код выполняется корректно.
  • SQL инъекция или можно?

    @hooligan377 Автор вопроса
    Ну если допустим мне нужно вывести ни текст, в который могли попасть хтмл или пхп теги, а логин и ид, то ХSS не должно быть или все таки есть возможность?

    Предварительно логин проходит валидацию и хтмл или пхп теги попасть туда не могут, а данные при выводе проходят процедуру (очистки или валидации, или как вернее будет) с помощью htmlspecialchars()
  • Переход на mysqli, как по новым стандартам?

    @hooligan377 Автор вопроса
    Александр Аксентьев, нужный мне я написал выше, работает на все 100%.. хотя это может моя криворукость. А так, спасибо, с подробным представление быстрее во всем разобрался)
  • Переход на mysqli, как по новым стандартам?

    @hooligan377 Автор вопроса
    Александр Аксентьев, Это типа пример всех остальных запросов?
  • Переход на mysqli, как по новым стандартам?

    @hooligan377 Автор вопроса
    Читал, вникал, долго не понимал.

    Верно ли делаю?

    $sql  = "SELECT count(1) FROM users WHERE login= ?";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param("s", $login);
    $stmt->execute();
    $stmt->bind_result($result);
    $stmt->fetch();
    if ($result)
    {
        echo "Логин доступен";
    } else {
        echo "Увы, но логин уже занят";
    }
  • Фильтрация, не, не слышал?

    @hooligan377 Автор вопроса
    Максим Тимофеев, Ну мне нужно получить, что бы в логине кроме букв и цифр ничего не было
  • PASSWORD_hash как проверить, верно ли условие?

    @hooligan377 Автор вопроса
    Алексей Уколов, Привет, да, отдохнул и все таки все получилось)))