如何使用PDO获取和显示特定数据

时间:2019-03-03 18:06:06

标签: php mysql

我在使我的项目上课和管理项目遇到问题时遇到了问题。抱歉,如果这里已经解决了。经过几天的搜索,我仍然无法终生找到从数据库查询到主页显示有限结果集的方法。

项目的这一部分使我的主页上列出了所有城镇,如下所示:

            Verona  
            Mantova
            Rovereto
            Bardolino 
            ...

我想要的是控制显示的内容!具体来说,我只想让Rovereto和Bardolino回来(例如)。我正在考虑使用其他页面进行此操作index1.php,因此在加载此页面时,它将仅显示所需的值,而不是所有获取的值!

搜索功能的结果也区分大小写。如果输入“ Bardolino”,则得到结果,但使用“ bardolino”,则完全没有乐趣。我是新手,请帮帮我。非常感谢你。

文件index.php:

            <table class="table">
            <thead>
            <tr>
            <th>#</th>
            <th>Lesson Number</th>
            <th>Town</th>
            </tr>
            </thead>
            <tbody>

            <?php

            for($i=0; $i < count(User::get_all_users()); $i++){
            echo "<tr>";
            echo "<td>".User::get_all_users()[$i]['id']."</td>";
            echo "<td>".Lesson::get_lesson_by_id(User::get_all_users()[$i]['lesson_id'])['number']."</td>";
            echo "<td>".show_town(Lesson::get_lesson_by_id(User::get_all_users()[$i]['lesson_id'])['town_id'])."</td>";
            echo "</tr>";
            }
            ?>

user_controller.php文件:

            if(isset($_GET['type']) && $_GET['type'] == 'search'){

            global $user_search_list;
            $user_search_list= array();

            for($i=0; $i < count(User::get_all_users()); $i++){
            $user = User::get_all_users()[$i];
            $lesson_number = Lesson::get_lesson_by_id($user['lesson_id'])['number'];
            $town_name = show_town(Lesson::get_lesson_by_id($user['lesson_id'])['town_id']);
            if(strpos($lesson_number,$_GET['search_term']) !== False ||
            strpos($town_name,$_GET['search_term']) !== False)
            {
            $user_search_list[] = $user;
            }
            }

            $_SESSION['search_list'] = $user_search_list;
            header("Location: search_user_list.php");
            exit();
            }

            if(isset($_GET['type']) && $_GET['type'] == 'reserve'){


            $user = User::get_user_by_id($_GET['user_id']);
            if(!empty($_GET['seat_id'])) {
            if(count($_GET['seat_id']) * $user['price'] > intval(Balance::get_user_balance($_SESSION['user_id'])['amount'])){
            header("Location: reserve.php?user_id=".$user['id']."&balance_error=set");
            exit();
            }else{

            foreach($_GET['seat_id'] as $seat_id){
            echo $seat_id;
            echo "<br>";
            Reservation::create_reservation('', $_SESSION['user_id'], $_GET['user_id'], $seat_id, getdate()[0]);
            Balance::update_balance($_SESSION['user_id'], intval(Balance::get_user_balance($_SESSION['user_id'])['amount']) - intval(User::get_user_by_id($_GET['user_id'])['price']));
            Seat::reserve_seat($seat_id,$_SESSION['user_id']);
            Action::create_action('', "User - ".$_SESSION['user_id'].'reserve Seat ID - '.$seat_id. " on User ID - ".$_GET['user_id'],"reserve" , getdate()[0]);

            }
            if(count(Reservation::get_all_reservations_by_user($_SESSION['user_id'])) == 5){
            Balance::update_balance($_SESSION['user_id'] ,intval(Balance::get_user_balance($_SESSION['user_id'])['amount']) + 10);
            header('Location: index.php?reserve_success=set&reward=set');
            exit();
            }
            header('Location: index.php?reserve_success=set');
            exit();

            }
            }

            else{
            header("Location: reserve.php?user_id=".$user['id']."&seat_error=set");
            exit();
            }
            }

            function show_town($id){
            return Place::get_place_by_id(Town::get_town_by_id($id)['place_id'])['name']. 
            }

User.php文件:

            class User
            {

            static $id;
            static $lesson_id;
            static $starting_date;
            static $starting_time;
            static $arrival_time;
            static $price;


            static function create_user($id, $lesson_id, $starting_date, $starting_time, $arrival_time, $price){
            global $db;
            $sql = "INSERT INTO `lesson_database`.`users` (`id`, `lesson_id`, `starting_date`, `starting_time`, `arrival_time`, `price`) VALUES (NULL, '".$lesson_id."', '".$starting_date."', '".$starting_time."', '".$arrival_time."', '".$price."');";
            $db_result = $db->query($sql);
            if($db_result){
            return True;
            }
            else{
            return False;
            }
            }
            static function get_all_users(){
            global $db;
            $sql = "SELECT * FROM `users`";

            $db_result = $db->query($sql);
            if($db_result){
            return $db_result->fetchAll();
            }
            else {
            return False;
            }
            }
            static function get_user_by_id($id){
            global $db;
            $sql = "SELECT * FROM `users` WHERE `id` = '".$id."' LIMIT 1";
            if(!isset($sql)){
            echo "not set";
            }
            $db_result = $db->query($sql);
            if($db_result){
            $db_row = $db_result->fetch(PDO::FETCH_ASSOC);
            if($db_row){

            return $db_row;
            }
            else {
            return False;
            }
            }
            return False;
            }
            static function delete_user($id){
            global $db;
            $sql =  "DELETE FROM `lesson_database`.`users` WHERE `users`.`id` = '".$id."'";
            $db_result = $db->query($sql);
            if($db_result){
            return True;
            }
            else{
            return False;
            }
            }

            }

1 个答案:

答案 0 :(得分:0)

我觉得您有点像跳过了一些基本知识,因此您跳过了一些基本知识。

首先,您已经在标题中提到过使用PDO,但您在查询中并未使用PDO,那么您确实需要使用PDO,因此,如果不确定如何尝试并找到有关如何使用PDO的良好教程,准备好的语句。

第二,您在循环内执行大量额外的调用,并在各处重复调用,因此我认为您可以通过查找有关设计模式的教程并考虑如何简化此代码来实现。

从根本上讲,您可以使用fetchAll(或我在mysqli中认为的fetch_assoc)来获得所有用户一次,然后仅循环访问该变量,例如。

<?php
         $users = User::get_all_users;

        foreach($users as $user){
        $lesson = Lesson::get_lesson_by_id($user['lesson_id']);
        echo "<tr>";
        echo "<td>".$user['id']."</td>";
        echo "<td>".$lesson['number']."</td>";
        echo "<td>".show_town(lesson['lesson_id'])['town_id'])."</td>";
        echo "</tr>";
        }

对于您的搜索,最简单的方法是在url中传递搜索字符串并使用全局$ _GET ['searchString'](显然,您需要清理字符串),然后直接在sql中搜索结果,例如

SELECT * FROM table WHERE town LIKE  . $yourvariable .%  (ideally in your newly learned PDO style)  

那么这将既不区分大小写,也意味着您首先获得了数据,因此您不会浪费时间在大量额外的行之间循环。

如果同时需要对此大小写不敏感,那么最简单的方法是将搜索和比较字符串转换为相同的大小写(例如,strtolower),然后它们将匹配

这也让我感到震惊,您的数据库可能状态不佳,因为我很惊讶地发现用户表中包含课程ID,因此您可能希望研究数据库规范化的思想,这将使您能够进行更多创造性的查询,并更轻松地将准确的信息汇总到您的任务中(即使其可扩展和可管理)。

我希望其中一些有用,抱歉,这不是一个快速的答案,但我认为这不是一个快速的问题。不过不要害怕,我们都从某个地方开始!