【问题标题】:how do I display different content from database on one php file?如何在一个 php 文件上显示来自数据库的不同内容?
【发布时间】:2014-03-17 13:58:30
【问题描述】:

我正在尝试使用一个 php 文件 php.project,并根据 1 个变量的名称从数据库中获取所需的所有数据并将其显示在网站上。现在我有一个问题。

我有一个 php 文件是这样的:

<?php

$pName = $_POST['name'];
$db_connection = mysqli_connect('localhost','root','',"project_online_planner");
if (!$db_connection){
    die('Failed to connect to MySql:'.mysql_error());
}

//insert into database
if(isset($_POST['insertComments'])){
    include('connect-mysql.php');
    $username = $_POST['username'];
    $comment = $_POST['comment'];
    $sqlinsert = "INSERT INTO user_comments (username, comment, project) VALUES ('$username', '$comment', '$pName')";
        if (!mysqli_query($db_connection, $sqlinsert)){
            die('error inserting new record');
        }
        else{
            $newRecord = "1 record added";
        }//end nested statement

}

//text from database
$query="SELECT * FROM user_comments where project = '$pName' ";
$results = mysqli_query($db_connection,$query);
$intro=mysqli_fetch_assoc($results);

$query2="SELECT * FROM project where name = '$pName' ";
$results2 = mysqli_query($db_connection,$query2);
$intro2=mysqli_fetch_assoc($results2);


?>
<!DOCTYPE HTML>
<html>
<head>
    <title>Project planner online</title>
    <script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
    <script type="text/javascript" src="libs/ppo.js"></script>
    <link rel="stylesheet" href="libs/ppo.css"/>
</head>
<body>
<div id="intro">

</div>
<div id="bgNav">
    <nav id="nav">
        <a href="index.php">Home</a>
        <a class="rightNav" href="register.php">Register</a>
        <a class="rightNav" href="login.php">Log in</a>
    </nav>
</div>

<div id="projectTile">
    <span id="statusCheck"><?php print_r($intro2["status"]); ?></span>
    <h2 id="prTitle"><?php print_r($intro2["name"]); ?></h2>
<div id="prPic"><img width="300" height="200" src="<?php print_r($intro2["image"]); ?>"></div>
<div id="prDescription"><?php print_r($intro2["description"]); ?></div>
</div>
<div id="comments">
    <?php
    while($row = mysqli_fetch_array($results))
    {
        echo nl2br("<div class='profile_comments'>" . $row['username'] . "</div>");
        echo nl2br("<div class='comment_comments'>" . $row['comment'] . "</div>");
    }
    ?>

</div>

<div id="uploadComments">
    <form method="post" action="project.php">
        <label for="name"><input type="hidden" name="insertComments" value="true"></label>
        <fieldset>
            <legend>comment</legend>
        <label>Name:<input type="text" id="name" name="username" value=""></label><br/>
        <label>Comments: <textarea name="comment" id="comment"></textarea></label>
        <input type="submit" value="Submit" id="submitComment">
        </fieldset>
    </form>
</div>

</body>
</html>

根据变量$pName,站点的内容会发生变化,因为它从数据库中获取内容,$pName 代表“项目名称”。

$pName is determenent by the name of the picture you click on the index page which is this:

<?php   

$db_connection = mysqli_connect('localhost','root','',"project_online_planner");
if (!$db_connection){
    die('Failed to connect to MySql:'.mysql_error());
}
$query="SELECT * FROM project limit 5 ";
$results = mysqli_query($db_connection,$query);
$intro=mysqli_fetch_assoc($results);
?>
<!DOCTYPE HTML>
<html>
<head>
    <title>Project planner online</title>
    <script src="http://code.jquery.com/jquery-2.1.0.min.js"></script>
    <script type="text/javascript" src="libs/ppo.js"></script>
    <link rel="stylesheet" href="libs/ppo.css"/>
</head>
<body>
<div id="bgNav">
    <div id="login">
        <a href="register.php">Register</a>
        <a href="login.php">Log in</a>
    </div>

    <nav id="nav">
        <a href="index.php">Home</a>
    </nav>
</div>
<h2 class="titlePage">Home</h2>
<div id="bgTile">
    <?php

    while($row = mysqli_fetch_array($results))
    {
        $project = $row["name"];
        echo nl2br("<img id=\"$project\" width='100px' alt='Procject name' height='100px' class='tile' src=". $row['image'] ."/>");
    }
    ?>

    <a href="allprojects.php"><div class="tile" id="tileM"><h2>Meer</h2></div></a>

</div>
    <form action="project.php" method="post" id="formF">
        <label><input id="inputF" type="hidden" name="name"></label><br>
        <input type="submit">
    </form>
</body>
</html>

通过单击图像,我将其名称放入表单中并将其提交到 project.php。在项目中。 php 它存储在变量 $pName 中。问题是,一旦我刷新页面,$pName 就会变成Null,并且您在页面上看不到任何数据库数据。我的问题是:如何在刷新页面时以$pName 不会变为Null 的方式更改此代码?对如何改进这段代码有什么建议吗?

这是我的javascript:

var check = null;
var form = $('#myForm');
$(document).ready(function(){
    $('img').click(function(){

        $('#inputF').val(this.id);
        $("input[type=submit]").trigger("click");
    });
});

【问题讨论】:

  • "我正在尝试使用一个 php 文件 "php.project"..."。不应该是project.php吗?
  • 阅读 PHP 会话。 w3schools.com/Php/php_sessions.asp
  • 将名称存储在会话变量中,并检查 if(!isset($_POST['name'])){ use session instead } 以获取 erxample
  • 你有一个sql注入问题。你应该阅读准备好的陈述。
  • @lorenzo456 我认为我的回答很有帮助。请考虑将其标记为已接受。

标签: javascript php jquery mysql database


【解决方案1】:

向您的代码添加会话(根据@aleation 的要求)。 此外,直接使用参数来查询您的数据库是非常危险的(正如@jeroen 提到的)。 阅读 SQL Injections 的主题并尝试在查询中使用 $pName 之前对其进行评估。

<?php
session_start();

if(!is_null($_POST['name']))
{ 
  $pName = $_POST['name'];
  $_SESSION['pName'] = $pName;
}
elseif (array_key_exists('pName',$_SESSION)) {
  $pName = $_SESSION['pName'];
}
else {
  $pName = ''; // Maybe set a default here?
}

$pName = $_POST['name'];
$db_connection = mysqli_connect('localhost','root','',"project_online_planner");
if (!$db_connection){
 die('Failed to connect to MySql:'.mysql_error());
}
...

对 SQL 注入带来的问题的一瞥:在您的示例中,假设有人发送一个名称为 ';Delete FROM project where id &lt;&gt; 的 POST 请求。 这将导致您丢失项目表中的所有条目。 查询注入甚至不会那么难猜。 通过分析您的网站,有人可以掌握用户数据、操纵用户数据、插入用户数据……你看到了吗?真是一团糟。

【讨论】:

  • 谢谢,我现在正在阅读它,我的代码完全按照我想要的方式工作。并感谢您的额外建议,真的很有帮助。
【解决方案2】:

为什么要使用 $_POST 变量来选择正确的内容?如果你用地址中的项目名称制作图片超链接,你可以刷新页面而不会丢失变量内容。

改变:

echo nl2br("<img id=\"$project\" width='100px' alt='Procject name' height='100px' class='tile' src=". $row['image'] ."/>");

进入

echo nl2br("<a href=\"project.php?name=$project\"><img id=\"$project\" width='100px' alt='Project name' height='100px' class='tile' src=".$row['image']."/></a>");

然后得到 $pname = $_GET['name'] 而不是 $pname = $_POST['name']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多