如何使用相同的查询来插入数据

时间:2017-02-17 15:57:55

标签: php mysql pdo

我是编程新手。

我正在尝试创建一个简单的guestbok。 我有一个索引页面,您可以在其中注册名字,姓氏和电子邮件。

如果您点击一个名称,则会重定向到带有ID的新页面。

我现在如何使用ID将相同的代码块插入此ID。

我的代码看起来像这样。

<?php
    require('dbconfig.php');

try {
        $conn = new PDO("mysql:host=$servername;dbname=projektone", $username, $password);
         //Set PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // Insert to database
        $sql = "INSERT INTO user (firstname, lastname, email)
        VALUE ('".$_POST["first_name"]."','".$_POST["last_name"]."','".$_POST["email"]."')";
        $sql = "INSERT INTO user (guestbok)
        VALUE ('".$_POST["guestbok"]."')";

        $conn->query($sql);
        }

        catch(PDOException $e)
        {
            echo $e->getMessage();
        }

header('Location: /');
?> 

提前致谢

/丹尼尔

3 个答案:

答案 0 :(得分:1)

加入原始文本并将它们传递到数据库进行处理并不是一个好主意。它会将您的系统打开到SQL injection。虽然当只有INSERT语句以这种方式公开时,某人可能不会破坏您的网站,但它确实意味着:

  • 任何名字中含撇号的人都会破坏请求的逻辑
  • 您正在公开一种方法,通过该方法,您可以通过向您的留言簿提交javascript来执行存储的XSS攻击

关于SQL注入问题,有两种方法可以保护你的系统 - 一种是转换数据,在这种方法中它不能破坏它所添加的SQL字符串(例如使用mysqli_real_escape_string())但建议的方法当使用PDO来调解代码时,与DBMS的交互是使用变量绑定。在这里,您可以使用数据占位符组合SQL命令,并在运行时替换它们。

如果您的ID是从mysql自动插入ID生成的,那么您可以从$ conn-&gt; lastinsertid中读取值

$stmt=$conn->prepare("INSERT INTO user (firstname, lastname, email)
    VALUES (:fnm,:lnm,:eml)");
$stmt->execute(array(
  ':fnm' => $_POST["first_name"],
  ':lnm' => $_POST["last_name"],
  ':eml' => $_POST["email"]));
$id=$conn->lastinsertid();

您的下一个问题是如何安全地将此信息传达给用户提交其留言簿评论的页面(在您尝试在同一页面中执行这两项操作的示例代码中)。

将它作为cookie或表单变量往返于浏览器,意味着它可能被篡改。有一些深奥的无状态解决方案,您可以执行此操作但数据已加密或加密签名,但最简单的解决方案是使用会话 - 在所有页面的顶部添加session_start(),并且可以存储您希望跨请求的任何数据在$ _SESSION超全球。

(还有与会话相关的安全问题)

当您收到包含留言簿数据的POST时,您应该使用UPDATE user SET guestbook=:gstbk WHERE id=:id_from_session(或者您可以将其插入一个id为foreign key的单独表格中)

最后,当您输出留言簿留在留言簿中的留言时,请确保您保护浏览器免受其中任何恶意内容的影响:

print htmlentities($guestbook);

答案 1 :(得分:0)

好吧,可能我设法得到你需要的东西。将以下两行放在dbconfig.php中:

$conn = new PDO("mysql:host=$servername;dbname=projektone", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

然后在需要数据库连接的地方需要它:

文件一:

require('dbconfig.php');
$sql = "sql 1";
$conn->query($sql);

然后在另一个文件

require('dbconfig.php');
$sql = "sql 2";
$conn->query($sql);

答案 2 :(得分:-1)

在执行之前,您正在使用新查询重写$ sql参数。这里有2个选项。

逐个插入查询:

$sql = "INSERT INTO user (firstname, lastname, email) VALUES ('".$_POST["first_name"]."','".$_POST["last_name"]."','".$_POST["email"]."')";
$conn->query($sql);

$sql = "INSERT INTO user (guestbok) VALUES ('".$_POST["guestbok"]."')";
$conn->query($sql);

将2个查询放在一个字符串中,然后执行:

$sql = "
    INSERT INTO user (firstname, lastname, email) VALUES ('".$_POST["first_name"]."','".$_POST["last_name"]."','".$_POST["email"]."'); 
    INSERT INTO user (guestbok) VALUES ('".$_POST["guestbok"]."');
";
$conn->query($sql);