我正在尝试使用一个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的方式更改此代码?关于如何改进此代码有什么建议吗?

这是我的javascript:

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

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

最佳答案

将会话添加到您的代码中(按@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注入带来的问题:在您的示例中,假设某人发送的POST请求的名称为';Delete FROM project where id <>
这将导致您失去项目表中的所有条目。
而且查询注入甚至不会那么难猜测。
通过分析您的网站,某人可以掌握用户数据,操纵用户数据,插入用户数据……您看到了吗?这是一团糟。

10-08 07:20
查看更多