我想通过使用php中的uniqid函数来设置url参数,我获得了唯一的数字,并通过在隐藏的输入形式中使用它们将它们放置在数据库中。我试图做到这一点,在脚本的开头,将$ number设置为一个uniqid,并将其放置在隐藏的输入中,这样它将被发布到数据库中,并且我可以使用相同的变量来创建href链接。
我遇到的问题是数据库中存储的值与href链接中使用的number变量中存储的值不同,href链接中的数字变量使该链接无效。如何使两个值相等,是否有更好的方法来做我想做的事情?
我尝试将uniqid()放在函数中
<?php
$servername = "localhost";
$username = "root";
$password = "";
$homeDB = "homeDB";
$conn = new mysqli($servername, $username, $password, $homeDB);
if($conn->connect_error) {
die("failed to connect to server".$conn->connect_error);
}
$number = uniqid();
if(isset($_POST["namn"])) {
$sql = "INSERT INTO information (firstname, lastname, urlID)
VALUES ('".$_POST["namn"]."','".$_POST["efternamn"]."',
'".$_POST["hide"]."')";
if($conn->query($sql)== TRUE){
$link = "http://localhost/sqltutorial/execute.php?id=".$number;
} else {
echo "failed";
}
echo $link;
}
html
<html>
<body>
<form method="post" action="home.php">
<input type="text" name="namn"> <br>
<input type="text" name= "efternamn"><br>
<input type="hidden" value="<?php $number ?>" name="hide">
<input type="submit" >
</form>
<br>
</body>
</html>
我在回显的链接上获得了不同的值,并且该值存储在数据库中(我知道这种形式并不安全)
答案 0 :(得分:1)
我认为您只需要在链接上使用$_POST['hide']
值即可。
最好仅在链接已创建时回显该链接。
当前有回显的位置,即使没有创建变量,也可以回显$link
变量!
<?php
$servername = "localhost";
$username = "root";
$password = "";
$homeDB = "homeDB";
$conn = new mysqli($servername, $username, $password, $homeDB);
if($conn->connect_error) {
die("failed to connect to server".$conn->connect_error);
}
$number = uniqid();
if(isset($_POST["namn"])) {
$sql = "INSERT INTO information (firstname, lastname, urlID)
VALUES ('".$_POST["namn"]."','".$_POST["efternamn"]."',
'".$_POST["hide"]."')";
if($conn->query($sql)== TRUE){
$link = "http://localhost/sqltutorial/execute.php?id=$_POST[hide]";
// line moved to here
echo $link;
} else {
echo "failed";
}
}
答案 1 :(得分:1)
问题在于回发运行时,您还会再次运行行$number = uniqid();
。因此,输出的最终数字不是您在隐藏字段中输入的数字。
现在,您可以写
$link = "http://localhost/sqltutorial/execute.php?id=".$_POST["hide"];
,它将输出在POST变量中传递的数字。
或者您可以等到回发发生时生成唯一ID,然后在数据库调用和输出中使用该ID。这样可以节省a)变量到浏览器并返回服务器的往返行程,以及b)试图篡改表单数据的任何人。因此,将数字创建代码移到if
内:
if(isset($_POST["namn"])) {
$number = uniqid();
...,然后将对$_POST["hide"]
的两个引用替换为$number
。您还可以从表单中删除隐藏字段。
最后一个替代建议:您甚至需要这样做吗?我假设您的数据库表具有一个auto_increment整数字段作为主键?为什么不只使用数据库已经生成的值作为链接的值呢?
if($conn->query($sql)== TRUE){
$link = "http://localhost/sqltutorial/execute.php?id=".$conn->insert_id;
将获得您插入的最后一行的自动生成的ID,并在链接中使用该ID。另请参见documentation
除非您有特定的原因,否则我看不出为行创建第二个ID的任何大目的(尤其是因为uniqid()does not promise总是为您提供一个完全唯一的值)?
答案 2 :(得分:-1)
因此,您要创建一行并在创建后在该链接上重定向。
步骤:
1)首先通过此函数为此informations
表获取下一个自动增量值,并将其存储在$number
中。
$stmt = $this->db->prepare("SHOW TABLE STATUS LIKE 'informations'");
$stmt->execute();
$result = $stmt->fetchAll();
foreach ($result as $row) {
$number = $row[10];
}
2)现在插入,插入后,您将获得相同的自动增量ID,并执行所有操作。
希望,会有所帮助。
注意::您还可以创建一个函数来为任何表获取该自动增量ID。