将记录插入MySQL DB

时间:2010-09-21 17:54:08

标签: php mysql

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

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

但是,如果$twittercontent包含'字符,我认为它会失败。正确的吗?

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

9 个答案:

答案 0 :(得分:5)

您需要查看mysql_real_escape_string。但是,我会考虑使用mysqliPDO类来使用预准备语句。

修改

请注意,这些都可以在PHP手册中找到,这些内容完全取自准备语句的示例。

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();
}
?>

示例用法PDO:

<?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_real_escape_string用法示例:

$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是什么,我无法完全定制。

SIDE NOTE

这是我愿意做的所有假设。 OP可以从POST和/或以数组形式获取数据,或者他可以从不同的方式获取数据。或者,或者,根据OP发布的示例,这与我可以定制到OP一样准确。如果您遇到问题或认为可以更好地解释/显示,那么请继续添加另一个解决该问题的答案,而不仅仅是另一个抱怨评论评论当您不愿意“正确”时,没有人做任何事情。 “回答你自己。

当然,如果它是一个数组,这会改变很多项目,OP应该清除它,而不仅仅是随机的人“猜测”数据的检索位置和方式。

答案 1 :(得分:3)

正确。它不仅会失败,而且会让你受到SQL Injection攻击。

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

请记住,用户输入应始终进行清理。

答案 2 :(得分:1)

这就是为什么你应该首先使用mysql_real_escape_string()功能

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

重要的是,您总是逃避(或一般消毒)您插入到来自不受信任来源(即不是来自您;)的查询中的变量。主题为 Google for 阅读:'SQL注入'

答案 3 :(得分:1)

在运行此查询之前,请使用:

$twittercontent = mysql_real_escape_string($twittercontent);

答案 4 :(得分:1)

是的,它会失败,因为它会过早地终止字符串。要解决此问题

mysql_real_escape_string($twittercontent)代替$twittercontent

答案 5 :(得分:1)

让您的生活更简单:

//$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 :(得分:0)

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

如果您使用PDO,您也可以使用绑定,而您不必担心转义。

$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();

答案 7 :(得分:0)

您也可以使用addslashes()mysql_real_escape_string()虽然更好。我同意使用PDO

答案 8 :(得分:-1)

如上所述,你必须使用mysql_real_escape_string()

请注意,您必须仅将此函数用于$ twittercontent变量, 但是对于查询中的每个字段
而且不仅仅用于插入而且不仅用于此表 从“不信任的投入”。

但实际上,您要在引号中添加查询的每个变量都应该使用此函数进行处理。没有例外或条件。
请注意,如果您不在查询中将变量放在引号中,则此函数将变为无用

另一种已经提到的方法是更改​​整个数据库驱动程序 不幸的是,没有人带来真实生活用法的有用例子,这可能非常有用。