代码之家  ›  专栏  ›  技术社区  ›  CLiown

将记录插入MySQL数据库

  •  1
  • CLiown  · 技术社区  · 14 年前

    我使用以下脚本将记录插入我的数据库:

    $sql = "INSERT INTO fotetweets VALUES('$tweetid','$dp', '', '$username','$tag', '$twittercontent', '$twittertimestamp', '')";
    mysql_query($sql);
    

    但是如果 $twittercontent ' 查尔,我想它会失败的。对的?

    如果是这样,我该如何正确处理?

    9 回复  |  直到 14 年前
        1
  •  5
  •   Jim    14 年前

    mysql_real_escape_string . 不过,我会考虑使用 mysqli PDO 改为使用类并使用准备好的语句。

    MySQLi的用法示例:

    <?php
    $mysqli = new mysqli("localhost", "my_user", "my_password", "my_database");
    
    /* check connection */
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    
    /* create a prepared statement */
    $stmt =  $mysqli->stmt_init();
    if ($stmt->prepare("INSERT INTO fotetweets VALUES(?, ?, '', ?, ?, ?, ?, '')")) {
        /* bind parameters for markers */
        $stmt->bind_param("issssi", $tweetid, $dp, $username, $tag, $twittercontent, $twittertimestamp);
    
        /* execute query */
        $stmt->execute();
    
        /* close statement */
        $stmt->close();
    }
    ?>
    

    <?php
    $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
    $user = 'dbuser';
    $password = 'dbpass';
    
    try {
        $dbh = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }
    
    $sth = $dbh->prepare('INSERT INTO fotetweets VALUES(?, ?, '', ?, ?, ?, ?, '')');
    $sth->execute(array($tweetid, $dp, $username, $tag, $twittercontent, $twittertimestamp));
    ?>
    

    mysql\u real\u escape\u字符串用法示例:

    $tweetid = (int) $tweetid; // static cast to integer, if that is what it should be.
    $sql = "INSERT INTO fotetweets VALUES(
        $tweetid,'" . mysql_real_escape_string($dp) . "', 
        '', '" . mysql_real_escape_string($username) . "', 
        '" . mysql_real_escape_string($tag) . "', 
        '" . mysql_real_escape_string($twittercontent) . "', 
        '" . mysql_real_escape_string($twittertimestamp) . "', '')";
    

    您可以在上面列出的手册页面找到更多信息和额外的用法示例。既然我知道 $dp 我不能精确地裁剪这个。

    这就是我愿意做的所有假设。OP可以从POST和/或数组形式获取数据,也可以从其他方式获取数据。或者,以OP发布的示例为例,这一点尽可能准确,我可以根据OP进行调整。如果您有问题或认为可以更好地解释/显示,好吧,继续添加另一个答案来解决这个问题,而不仅仅是另一个抱怨评论,当你不愿意自己给出“正确”的答案时,没有人会做正确的事情。

    当然,如果它是一个数组,这会改变很多项,OP应该澄清这一点,而不仅仅是随机的人们“猜测”在哪里以及如何检索数据。

        2
  •  3
  •   NullUserException Mark Roddy    14 年前

    对的。它不仅会失败,还会让你敞开心扉 SQL Injection

    为了避免这些问题,您可以使用:

    记住,用户输入应该 消毒。

        3
  •  1
  •   Aditya M P    14 年前

    在运行此查询之前,请使用以下命令:

    $twittercontent = mysql_real_escape_string($twittercontent);
    
        4
  •  1
  •   codaddict    14 年前

    mysql_real_escape_string($twittercontent) 代替 $twittercontent

        5
  •  1
  •   mario    14 年前

    //$pdo = new PDO("mysql:host=localhost;dbname=testdb", user, pass);
    
    $pdo->prepare("INSERT INTO fotetweets VALUES (?,?,?,?,?,?,?,?)")
        ->execute( array($tweetid, $dp, '', $username, $tag, $twittercontent, $twittertimestamp, '') );
    

    这会将数据正确地发送到数据库,而不会出现安全问题。将其用作所有查询的模板。(请注意,以后再次输出数据库内容时,仍然必须应用htmlspecialchars()。)

        6
  •  1
  •   BenMorel Sonaten    11 年前

    mysql_real_escape_string() 功能优先

    http://www.php.net/manual/en/function.mysql-real-escape-string.php

    重要的是,您总是转义(或通常清理)插入到查询中的变量,这些变量来自不受信任的源(即不是来自您;)。给你的话题 阅读:“SQL注入”

        7
  •  0
  •   afkbowflexin    14 年前
        8
  •  0
  •   Jim    14 年前

    正如我之前提到的,你可以用 mysql_real_escape_string

    如果您使用PDO,那么也可以使用binding,而不必担心转义。

    $stmt = $db->prepare("INSERT INTO fotetweets VALUES(:tweetid,:dp, '', :username,:tag,    :twittercontent, :twittertimestamp, '')");
    $stmt->bindParam(':tweetid', $tweetid);
    $stmt->bindParam(':dp', $dp);
    $stmt->bindParam(':username', $username);
    $stmt->bindParam(':tag', $tag);
    $stmt->bindParam(':twittercontent', $twittercontent);
    $stmt->bindParam(':twittertimestamp', $twittertimestamp);
    $stmt->execute();
    
        9
  •  -1
  •   Your Common Sense    14 年前

    如上所述,您必须使用mysql\u real\u escape\u string()

    请注意,您必须使用此函数,而不仅仅用于$twittercontent变量,

    以及“不可信的输入”。

    但实际上你要输入到查询中的每个变量 ,应使用此函数进行处理。没有例外或条件。
    注意:如果在查询中不将变量放在引号中,此函数将变得无用

    另一种方法(前面也提到过)是更改整个数据库驱动程序。