无法检索要在另一个查询中使用的 SQL 数据 [重复]

unable to retrieve sql data to use in another query [duplicate]

提问人:alexander wallaard 提问时间:4/8/2020 最后编辑:RBTalexander wallaard 更新时间:4/18/2020 访问量:61

问:

我正在为一个问题而苦苦挣扎,也许有人可以帮助我:)

在第一个查询中,我想将数据发送到第一个为我生成 id 的表,在第二个 quary 中,我想检索第一个 quary 制作的 id,在第 3 个 quary 中,我想使用该 id 在第二个表中插入其他数据,其 id 与第一个表相同。

我的问题是:除了$id之外,所有东西都插入得很好,我是否遗漏了什么?

<?php
    session_start();
    //declaratie sessie variabelen
    $username = $_SESSION['username'];
    $voornaam = $_SESSION['voornaam'];
    $achternaam = $_SESSION['achternaam'];
    $firma = $_SESSION['firma'];

    //database configuratie file
    require('dbconfig.php');

    //Declaratie post variabelen
    $ticnaam = $_POST['ticket_naam'];
    $ticonderwerp = $_POST['ticket_onderwerp'];
    $ticassign = $_POST['ticket_voor'];
    $bericht = $_POST['bericht'];

    //proccesing


    //procces first quary
    $sql = "INSERT INTO `tickets` 
                        (`naam`, `onderwerp`, `maker`) 
                VALUES ('$ticnaam', '$ticonderwerp', '$username')";

    //retrieves the generated new id from the quary above
    $sql2 = "SELECT id FROM tickets where onderwerp='$ticonderwerp' AND naam = '$ticnaam';";
    $result2 = mysqli_query($mysqli,$sql2);
    $id = mysqli_fetch_array($result2,MYSQLI_ASSOC);


    //insertes the id into another quary
    $sql3 = "INSERT INTO `berichten` 
                        (`id`, `text`, `voornaam`,`achternaam`,`firma`) 
                VALUES ('$id', '$bericht', '$voornaam',
                        '$achternaam','$firma')";

    //sql3 ok? user can continu
    if($mysqli->query($sql3) == TRUE) {
        require('email_na_ticketaanmaak.php')
?>
<script>alert('nieuw ticket is gemaakt');</script>
<?php
        require('../procces_files/email_na_ticketaanmaak.php');
        header('Location: ../home/index.php');
    }else{
        echo "Error: " . $sql . "<br>" . $mysqli->error;
    }
    $mysqli->close();
?>
php html sql 会话 mysqli

评论

0赞 RiggsFolly 4/8/2020
您需要在此处查看手册页mysqli::$insert_id
0赞 Funk Forty Niner 4/8/2020
首先,您从未执行过 的 INSERT 查询。$sql
0赞 Markus Zeller 4/8/2020
使用预准备语句来防止 SQL 注入。
0赞 RiggsFolly 4/8/2020
@FunkFortyNiner 哦,是的,错过了,我需要停下来喝下午茶
0赞 Funk Forty Niner 4/8/2020
@RiggsFolly 呵呵,在这些艰难的时刻全神贯注是正常的。

答:

0赞 RiggsFolly 4/8/2020 #1

mysqli 对象有一个属性,如果该列是 AutoIncrement 列,则该属性将返回新插入的行。$insert_ididid

<?php
    session_start();

    //database configuratie file
    require('dbconfig.php');

    // process first query
    $sql = "INSERT INTO `tickets` 
                    (`naam`, `onderwerp`, `maker`) VALUES (?,?,?)";

    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('sss', $_POST['ticket_naam'],
                            $_POST['ticket_onderwerp'],
                            $_SESSION['username']);
    $stmt->execute();

    // retrieves the generated new id from the query above
    $new_id = $mysqli->insert_id;

    // inserts the id into another query
    $sql = "INSERT INTO `berichten` 
                        (`id`, `text`, `voornaam`,`achternaam`,`firma`) 
                VALUES (?,?,?,?,?)";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('isss', $new_id,
                                $_POST['bericht'],
                                $_SESSION['voornaam'],
                                $_SESSION['achternaam'],
                                $_SESSION['firma']);
    $res = $stmt->execute();
    if ($res) {
        require('email_na_ticketaanmaak.php')
        require('../procces_files/email_na_ticketaanmaak.php');
        header('Location: ../home/index.php');
    }else{
        echo "Error: " . $sql . "<br>" . $mysqli->error;
    }
?>

如果您要重定向到另一个页面

header('Location: ../home/index.php');

将其发送回您所在的页面是没有意义的,因为您永远不会看到它。

<script>alert('nieuw ticket is gemaakt');</script>

此外,您的脚本对 SQL 注入攻击持开放态度。 即使你正在逃避输入,它也不安全!您应该考虑在 或 API 中使用准备好的参数化语句,而不是串联值MYSQLI_PDO

因此,我稍微更改了代码,以使用参数化、准备和绑定的查询。