【问题标题】:php/mysql/jquery (broken with simple jquery code)php/mysql/jquery(用简单的 jquery 代码破解)
【发布时间】:2013-06-03 23:31:40
【问题描述】:

我一直在尝试创建一个注册用户的 SPA,将用户存储在数据库中,然后在 div 中显示用户信息。我正在使用 PHP/MYSQL 和 jQuery。以下是该问题的演练:

我得到了所有的波纹管代码;我会先发布这个——然后再回顾一下当我尝试使用 jQuery 时会发生什么。

index.php

<!DOCTYPE HTML>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>it IT</title>
  <link rel="stylesheet" type="text/css" href="application.css" />
  <script src="jquery.js"></script> 
  <script src="application.js"></script>
  <script type="text/javascript" src="ejs_production.js"></script>
  <!--[if lt IE 9]>
  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  <![endif]-->
</head>
<body>
    <h1>it IT</h1>
    <div id="signup">
        <form id="signupform" method="post" action="insert_ac.php">
            Username: <input type="text" name="username" id="username"><br>
            Password: <input type="password" name="pw" id="pw"><br>
            Email: <input type="text" name="email" id="email"><br>
            <input type="submit" name="Submit" value="Submit">
        </form>
    </div>
    <div id="signin"></div>
    <div id="showuser">
        <h2>Username - Email</h2>
        <ul id="listuser"></ul>
    </div>
</body>
</html>

插入_ac.php

<?php

$host="localhost"; // Host name
$uname="root"; // Mysql username
$password="bonjour3"; // Mysql password
$db_name="itit"; // Database name
$tbl_name="users"; // Table name

// Connect to server and select database.
$link = mysqli_connect("$host", "$uname", "$password", "$db_name")or die("cannot connect");

// Get values from form
$username=$_POST['username'];
$pw=$_POST['pw'];
$email=$_POST['email'];

// Insert data into mysql
$sql="INSERT INTO $tbl_name(username, password, email)VALUES('$username', '$pw', '$email')";
$result=mysqli_query($link, $sql);

// if successfully insert data into database, displays message "Successful".
if($result){
echo "Successful";
echo "<BR>";
echo "<a href='index.php'>Back to main page</a>";
}

else {
echo "ERROR";
}
?>

<?php
// close connection
mysqli_close($link);
?>

就像我说的,上面所有的代码都可以正常工作——创建了一个用户,并且 echo 在 if/else 语句中正常工作。

现在 - 我想在“listuser” div 中插入一个 .php 文件(基本上是作为模板)。此模板应显示用户的电子邮件和用户名。

这是模板:

模板/showuser.php

<?php
    $host="localhost"; // Host name
    $uname="root"; // Mysql username
    $password="bonjour3"; // Mysql password
    $db_name="itit"; // Database name
    $tbl_name="users"; // Table name

// Connect to server and select database.
    $link = mysqli_connect("$host", "$uname", "$password", "$db_name")or die("cannot connect");
    $lastuser="SELECT * FROM users ORDER BY autoIncrementColumn DESC LIMIT 1";
    $result = mysqli_query($link,$lastuser) or die (mysql_error());
    $row = $result->fetch_assoc();
?>

<li><? echo $row['username'] ?> - <? echo $row['email'] ?></li>

<?php
// close connection
mysqli_close($link);
?>

接下来,我注释掉这段代码(来自 insert_ac.php):

// if successfully insert data into database, displays message "Successful".
if($result){
echo "Successful";
echo "<BR>";
echo "<a href='index.php'>Back to main page</a>";
}

else {
echo "ERROR";
}

这是替代我注释掉的 jQuery:

应用程序.js

$(document).ready(function() {
    $("#signupform").submit(function(e) {  
        e.preventDefault();
        $("#listuser").load("templates/showuser.php")
        $("#signupform").remove();   
    });
});

当我注释掉 insert_ac.php 代码并实现 jQuery 时 - 模板显示在 listuser div 中,但用户不再被保存,因此模板中不显示任何内容(“-”字符除外)。有谁知道为什么,一旦我实现了 jQuery - 用户不再被保存?

更新

由于一些建议,我试图让我的代码更安全。这是我所做的更改...它似乎正在工作 - 用户被保存 - 并且 printf() 语句被显示。

插入_ac.php

<?php

$host="localhost"; // Host name
$uname="root"; // Mysql username
$password="bonjour3"; // Mysql password
$db_name="itit"; // Database name
$tbl_name="users"; // Table name

// Connect to server and select database.
$link = mysqli_connect("$host", "$uname", "$password", "$db_name")or die("cannot connect");

// Get values from form
$username=$_POST['username'];
$pw=$_POST['pw'];
$email=$_POST['email'];

// Insert data into mysql
$sql= $link->prepare("INSERT INTO $tbl_name(username, password, email)VALUES(?,?,?)");
$sql->bind_param('sss', $username, $pw, $email);
$sql->execute();
printf("%d Row inserted.\n", mysqli_stmt_affected_rows($sql));
mysqli_stmt_close($sql);
// if successfully insert data into database, displays message "Successful".
//if($result){
//echo "Successful";
//echo "<BR>";
//echo "<a href='index.php'>Back to main page</a>";
//}

//else {
//echo "ERROR";
//}
//?>

<?php
// close connection
mysqli_close($link);
?>

这更安全/我应该怎么做?

【问题讨论】:

  • 你能把它精简到相关部分吗?这远远超出了要求。在您遭受SQL injection bug 的困扰之前,您还紧急需要阅读bind_param。请在遇到严重麻烦之前解决此问题。
  • 安全问题无处不在!就像@tadman 说的,请阅读并尝试编写更优雅的代码
  • 酷...刚刚阅读 - 生病更新我的问题,你可以告诉我它是否安全...对于更新...我还注释掉了 application.js,所以 jquery 不会我测试的时候搞砸了。我只是想彻底解决我的问题..你认为什么与我的问题无关?

标签: php jquery mysql forms templates


【解决方案1】:

我想出了我想要做什么...如果有人也想尝试的话,这就是我的所有代码!

插入_ac.php

<?php

$host="localhost"; // Host name
$uname="root"; // Mysql username
$password="bonjour3"; // Mysql password
$db_name="itit"; // Database name
$tbl_name="users"; // Table name

// Connect to server and select database.
$link = mysqli_connect("$host", "$uname", "$password", "$db_name")or die("cannot connect");

// Get values from form
$username=$_POST['username'];
$pw=$_POST['pw'];
$email=$_POST['email'];

// Insert data into mysql
$sql= $link->prepare("INSERT INTO $tbl_name(username, password, email)VALUES(?,?,?)");
$sql->bind_param('sss', $username, $pw, $email);
$sql->execute();
printf("%d Row inserted.\n", mysqli_stmt_affected_rows($sql));
mysqli_stmt_close($sql);
// if successfully insert data into database, displays message "Successful".
//if($result){
//echo "Successful";
//echo "<BR>";
//echo "<a href='index.php'>Back to main page</a>";
//}

//else {
//echo "ERROR";
//}
//?>

<?php
// close connection
mysqli_close($link);
?>

index.php

<!DOCTYPE HTML>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>it IT</title>
  <link rel="stylesheet" type="text/css" href="application.css" />
  <script src="jquery.js"></script> 
  <script src="application.js"></script>
  <!--[if lt IE 9]>
  <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  <![endif]-->
</head>
<body>
    <h1>it IT</h1>
    <div id="signup">
        <form id="signupform" method="post" action="insert_ac.php">
            Username: <input type="text" name="username" id="username"><br>
            Password: <input type="password" name="pw" id="pw"><br>
            Email: <input type="text" name="email" id="email"><br>
            <input type="submit" name="Submit" value="Submit">
        </form>
    </div>
    <div id="signin"></div>
    <div id="showuser">
        <h2>Username - Email</h2>
        <ul id="listuser"></ul>
    </div>
</body>
</html>

应用程序.js

$(document).ready(function() {
    $("#signupform").submit(function(e) {  
        e.preventDefault();
        $.post('insert_ac.php', $(this).serialize(), function(){
            $("#listuser").load("templates/showuser.php");
            $("#signupform").remove();   
        });
    });
});

模板/showuser.php

<?php
    $host="localhost"; // Host name
    $uname="root"; // Mysql username
    $password="bonjour3"; // Mysql password
    $db_name="itit"; // Database name
    $tbl_name="users"; // Table name

// Connect to server and select database.
    $link = mysqli_connect("$host", "$uname", "$password", "$db_name")or die("cannot connect");
    $result = mysqli_query($link,"SELECT username, email FROM users ORDER BY autoIncrementColumn DESC LIMIT 1");
    $row = mysqli_fetch_assoc($result);
?>

<li><? echo $row['username'] ?> - <? echo $row['email'] ?></li>

<?php
// close connection
mysqli_close($link);
?>

【讨论】:

    【解决方案2】:

    您正在阻止此行中的默认值

    e.preventDefault();
    

    并且从不实际发布文件

    试试

    e.preventDefault();
    $.post('insert_ac.php', $(this).serialize(), function(){
        $("#listuser").load("templates/showuser.php");
        $("#signupform").remove();   
    });
    

    【讨论】:

    • 嘿橙色..我正在努力使我的代码更安全...比我看看你的响应是否是我需要的...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    相关资源
    最近更新 更多