【问题标题】:prepare($sql) function not working on one scriptprepare($sql) 函数不适用于一个脚本
【发布时间】:2019-01-28 02:01:11
【问题描述】:

我正在开展一个学校项目,该项目涉及一个具有数据库集成的网站。目前正致力于通过它向网站添加新内容(文本、标题、图像)。我已经可以通过网站将新用户添加到数据库中,但由于某种原因,相同的代码和逻辑不适用于内容。

我注意到使用 echo 打印 $stmt 不会打印任何内容。

<?php

include "../conn.php";

$sql = "INSERT INTO `contenido` (`id_contenido`, `tipo_contenido`, `id_seccion`, `orden_contenido`, `largo_contenido`, 'corto_contenido', 'extra_contenido') VALUES (NULL, '".$_POST["tipo"]."', '".$_GET['id']."','".$_POST["orden"]."','".$_POST["largo"]."','".$_POST["corto"]."','".$_POST["extra"]."')";

$stmt = $conn->prepare($sql);
if ($stmt = $conn->prepare($sql))
{
    //echo "It worked";

    $stmt->execute();
    $last_id = $conn->insert_id;

    header("Location: editarContenidos.php?id=".$_GET['id']);
}

?>

预期结果:内容信息上传到数据库,用户被重定向到编辑内容页面(editarContenidos.php)

实际结果:白屏,无错误。由于 if 条件为 false,因此您永远不会被重定向,也不会将内容上传到数据库。

注意:插入用户 .php 使用相同的逻辑和语法,我没有足够的 php 经验来理解我做错了什么。

【问题讨论】:

  • 这里没有足够的信息来回答这个问题;请显示您的$_POST 内容,确保设置了每个值。最好使用isset() 检查这些内容。还要检查它们是否与您的数据库值正确匹配,以及您是否具有运行该操作所需的权限。最后,check for error messages 在输出中。
  • 还请注意,您的代码对于SQL injection 来说是易受攻击的。千万不要在 SQL 语句中直接使用$_POST!您应该改用prepared statements,绑定到变量。还要确保您的数据库用户只有required privileges。您可以参考this post 了解有关如何防止 PHP 中的 SQL 注入的更多信息 :)
  • 最后,header() 永远不会在您将echo 内容添加到页面后触发。假设您没有回显it worked,您的重定向应该可以正常工作。
  • 我知道它很容易受到 SQL 注入的影响,因为我们还没有在课堂上看到该主题。无论如何,感谢您的链接,当我有机会时会给他们一个阅读。您能否指定检查设置值的含义?有些值是空的,因为这就是它在数据库中的方式。如何检查值是否直接与数据库匹配?我确实拥有所需的权限,因为我还有其他 2 个 .php 与此 .php 执行基本相同的操作,再次感谢

标签: php mysql sql prepared-statement


【解决方案1】:

我假设 id_contenido 是一个 auto_increment 字段,我不确定反引号如何在各种语言中工作。我建议添加一些错误处理PDO::errorInfo 并将 SQL 代码更改为:

$sql = "INSERT INTO contenido (tipo_contenido, id_seccion, orden_contenido, largo_contenido, corto_contenido, extra_contenido) VALUES ('".$_POST["tipo"]."', '".$_GET['id']."','".$_POST["orden"]."','".$_POST["largo"]."','".$_POST["corto"]."','".$_POST["extra"]."')";

SQL 代码中有一个$_GET['id'],我不知道这是不是故意的。

我建议使用参数和使用print_r($_POST); 进行一些调试。

试试下面的代码:

<?php

include "../conn.php";

$sql = "INSERT INTO contenido (id_contenido, tipo_contenido, id_seccion, orden_contenido, largo_contenido, corto_contenido, extra_contenido) VALUES (?,?,?,?,?,?)";

$stmt = $conn->prepare($sql);
if ($stmt))
{
    //echo "It worked";

    $stmt->execute(array($_POST["tipo"], $_GET['id'],$_POST["orden"],$_POST["largo"],$_POST["corto"],$_POST["extra"]));
    $last_id = $conn->lastInsertId();

    header("Location: editarContenidos.php?id=".$_GET['id']);
}

?>

【讨论】:

  • 您好,感谢您的回答。我试过你的代码,它似乎没有改变任何东西。它仍然只显示一个白屏,数据库没有变化。
【解决方案2】:

我发现了问题所在。引号没有正确使用。 以下代码有效:

    <?php

    include "../conn.php";

    $sectionid = $_GET['id'];

    $sql = "INSERT INTO contenido (id_contenido, tipo_contenido, id_seccion, orden_contenido, largo_contenido, corto_contenido, extra_contenido) VALUES (NULL, '".$_POST["tipo"]."', '".$sectionid."','".$_POST["orden"]."','".$_POST["largo"]."','".$_POST["corto"]."','".$_POST["extra"]."')";

    $stmt = $conn->prepare($sql);

    //echo $sql;

    if ($stmt = $conn->prepare($sql))
    {
        $stmt->execute();
        $last_id = $conn->insert_id;

        header("Location: editarContenidos.php?id=".$sectionid);
    }

?>

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2018-04-09
    相关资源
    最近更新 更多