Перенос определенных данных из результата запроса mysql, когда пользователь выбирает данные - PullRequest
0 голосов
/ 16 мая 2019

Это мой первый вопрос о потоке стека, поэтому надеюсь, что я объясню это хорошо. Я довольно плохо знаком с php / js / html и столкнулся с проблемой. Я запрашиваю свою базу данных, используя переменную сеанса, и она возвращает все результаты, связанные с вошедшим в систему пользователем. Ниже приведен код php, который я использовал для получения результатов.

<?php

session_start();

include('conn.php');

if(!isset($_SESSION['40219357_user'])){
    header('Location:index.php');
}

    $username = $_SESSION['40219357_user'];
    $userid = $_SESSION['40219357_id'];

    $read = "SELECT * FROM medi_users WHERE dr_id = '$userid'";
    $result = $conn ->query($read);

?>

Результат этого запроса отображается в таблице на моем сайте. Когда вошедший в систему пользователь веб-сайта нажимает на запись о человеке, он должен отображать всю информацию, касающуюся этого конкретного человека.

С тех пор как я задал свой оригинальный вопрос, я нашел простое решение своей проблемы, передав идентификатор пользователя как скрытое значение в кнопке. Код для этого ниже.

<?php

        while($row = $result ->fetch_assoc()){
            $rowid = $row['id'];
            $firstname = $row['firstname'];
            $surname = $row ['surname'];
            $dob = $row['dob'];
            $address = $row['address'];
            $town = $row['town'];
            $postcode = $row['postcode'];


            echo"   
                <tbody>
                    <tr>
                        <td>$firstname</td>
                        <td>$surname </td>
                        <td>$dob</td>
                        <td>$address</td>
                        <td>$town</td>
                        <td>$postcode</td>
                        <td><a class = 'btn btn-danger' 
                 href `='patientsmedication.php?editid=$rowid'>View</a></td>`
                    </tr>

            ";

        }
    ?>
</tbody>
    </table>
    </div>
</div>

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

1 Ответ

0 голосов
/ 17 мая 2019
<?php

session_start();
//I think you are already using PDO/Mysqli prepared statements
//in this file since you call $conn->query below
include('conn.php');

    if(!isset($_SESSION['40219357_user'])){
        header('Location:index.php');
    }
    //
    $username = $_SESSION['40219357_user'];
    $userid = $_SESSION['40219357_id'];


    //so to make this secure use place markers and bind your params
    $read = "SELECT * FROM medi_users WHERE dr_id = '$userid'";
    //becomes:
    $read = "SELECT * FROM medi_users WHERE dr_id = :userId";
    $q = $conn->prepare($read);
    $q->bindParam(":userId",$userId,PDO::PARAM_INT);
    $q->execute();

    //now you can fetch your result set and store it in a variable
    $results = $q->fetchAll();
?>

тогда вы можете просмотреть результаты с помощью foreach

 echo "<table>
          <tr>
             <th>Heading 1</th><th.....
          </tr>";

  foreach($results as $row) {
        $rowid = $row['id'];
        //I'm not sure if this is the right id,
        //you would need to confirm, I would think you want to have a user id, but obviously don't know the structure
        //of your database - if this is the user (patient?)
        //id then it's fine
        $firstname = $row['firstname'];
        $surname = $row ['surname'];
        $dob = $row['dob'];
        $address = $row['address'];
        $town = $row['town'];
        $postcode = $row['postcode'];

       echo "<tr>
                    <td>$firstname</td>
                    <td>$surname </td>
                    <td>$dob</td>
                    <td>$address</td>
                    <td>$town</td>
                    <td>$postcode</td>
                    <td><a class='btn btn-danger' 
             href='patientsmedication.php?patientId=$rowid'>View</a></td>//or whatever the relevant id is
                </tr>";
    }
    echo "</table">;

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

Теперь в Patientmedication.php вы можете получить идентификатор пациента, используя $_GET['patientId']

<?php
session_start();   
include('conn.php');

if(!can_view_patient_details()) {
   header('Location:error_page.php');
   exit();
} else {
   $patientId = isset($_GET['patientId'])??0;
   //if you aren't using php7 you won't have the null coalescing operator so use a ternary style like $var = cond ? A : B

   //now do your query

$q = "SELECT * FROM yourtable WHERE patientId = :patientId";
$q = $conn->prepare($q);
$q->bindParam(":patientId",$patientId,PDO::PARAM_INT);
$q->execute();

//now you can fetch your result set and store it in a variable
$results = $q->fetchAll();

}

function can_view_patient_details() {
    //this should return true or false
    //you would need to design your own permissions checks, 
    //given the nature of your project I would think you would
    //do a database call to confirm the user has the right access
    //to the patient, but you may just check that the correct
    //sessions are set, you'd have to decide what is most appropriate
}


?>

Затем с вашим результатом вы можете создать страницу так, как считаете нужным - если вы собираетесь использовать эту страницу для обновления деталей, я бы предложил форму, потому что вы можете использовать метод $_POST, который не отображает информацию в URL - тогда я бы предложил, чтобы он проходил через контроллер, чтобы сделать все правильные проверки для разрешений, типов данных и т. д.

Если вы не попали в паттерны MVC (что вполне вероятно, если вы только начинаете), то хотя бы направьте вашу форму в отдельный скрипт, а затем вернитесь на эту страницу с некоторыми отзывами - либо с помощью флажка в URL или установив сообщение сеанса и выводя его.

Несколько вещей, на которые стоит обратить внимание: я предполагаю, что вы используете PDO, а не подготовленные Mysqli операторы, они оба хороши, но синтаксис немного отличается, и мой ответ использует PDO только в PDO, который вам больше не нужен потребность использовать точки с запятой на ваших маркерах места (:userId == userId) но я лично предпочитаю это для удобства чтения при написании sql. Кроме того, ваши имена сеансов выглядят так, как будто в них есть идентификатор пользователя (это может быть внутренний код, хотя это что-то значит), но если это идентификатор, его не очень легко настроить таким образом - проще просто иметь сеанс с именем 'user' и присваивать ему значение идентификатора - иначе как бы вы узнали имя сеанса, не ища пользователя, что могло бы победить объект.

Надеюсь, это укажет вам правильное направление, я рекомендую ознакомиться с паттернами PDO и MVC

...