SQL查询结果与变量不同

时间:2019-03-26 13:54:41

标签: php mysql sql

我想通过使用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>

我在回显的链接上获得了不同的值,并且该值存储在数据库中(我知道这种形式并不安全)

3 个答案:

答案 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。

相关问题