我使用以下脚本将记录插入我的数据库:
$sql = "INSERT INTO fotetweets VALUES('$tweetid','$dp', '', '$username','$tag', '$twittercontent', '$twittertimestamp', '')";
mysql_query($sql);
但是,如果$twittercontent
包含'
字符,我认为它会失败。正确的吗?
如果是这样,我该如何正确处理?
答案 0 :(得分:5)
您需要查看mysql_real_escape_string。但是,我会考虑使用mysqli
或PDO
类来使用预准备语句。
修改强>
请注意,这些都可以在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)
答案 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变量,
但是对于查询中的每个字段
而且不仅仅用于插入而且不仅用于此表
从“不信任的投入”。
但实际上,您要在引号中添加查询的每个变量都应该使用此函数进行处理。没有例外或条件。
请注意,如果您不在查询中将变量放在引号中,则此函数将变为无用
另一种已经提到的方法是更改整个数据库驱动程序 不幸的是,没有人带来真实生活用法的有用例子,这可能非常有用。