将字符串插入Mysql临时表时出错

时间:2013-05-27 00:01:31

标签: mysql json curl

我确信这是一个简单的解决方案,但到目前为止,我很难过......

所以我试图使用下面的代码将数据插入到临时mysql表中:

mysql_query("CREATE TEMPORARY TABLE IF NOT EXISTS data(
id INT NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(id),

name VARCHAR(255))")
or die(mysql_error());

$search_term = 'snakes';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://gdata.youtube.com/feeds    
/api/videos?q='.$search_term.'&safeSearch=none&orderby=viewCount&v=2&alt=json&start- 
index=1&max-results=20');
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$output = curl_exec($ch);
curl_close($ch);

$data = json_decode($output,true); 

$info = $data["feed"];
$video = $info["entry"];
$nVideo = count($video);


foreach ($video as $video) {

$video_id = $video['media$group']['yt$videoid']['$t'];
$title = $video['title']['$t'];

$insert = "INSERT INTO data (name)  " .

      "VALUES
       ('$video_id')";             

$results = mysql_query($insert)
or die(mysql_error()); 

}

当我按原样保留此代码时(将$ video_id作为我插入表中的值),一切都很完美。但是,如果我更改$ video_id并尝试插入$ title,请执行以下操作:

foreach ($video as $video) {

$video_id = $video['media$group']['yt$videoid']['$t'];
$title = $video['title']['$t'];
echo $title;
$insert = "INSERT INTO data (name)  " .

      "VALUES
       ('$title')";             

$results = mysql_query($insert)
or die(mysql_error()); 

}

我得到“你的SQL语法有错误;请查看与你的MySQL服务器版本对应的手册,以便在'ma Snake(原始/官方)附近使用正确的语法[如Tosh.0所见]') '在第2行“。现在,当我在我的foreach循环中回显标题的值时,就像这样......

foreach ($video as $video) {

$video_id = $video['media$group']['yt$videoid']['$t'];
$title = $video['title']['$t'];
echo $title;
echo "<br>";
$insert = "INSERT INTO data (name)  " .

      "VALUES
       ('$video_id')";             

$results = mysql_query($insert)
or die(mysql_error()); 

}

我明白了:

GIANT SNAKE EATS SECURITY GUARD
Snake woman
Biggest Snake of the World for Sale, 25 000 €
Giant Snake
A Huge Centipede Fighting A Snake
Scary Killer Snakes, World Biggest Snake Ever!
Five Headed Snake In India.
Clelia eats Bothrops
snake swallowed a hippo
The world biggest Snake has been found in SAAD - Karaj (Iran)
WORLD LARGEST SNAKE FOUND DEAD! ★★★★★
Cobra vs. Rat Snake
I'm a Snake ( original / official ) [ As seen on Tosh.0 ]
Bull Snake Against Squirrel
The Biggest Snake In The World
Shark Vs. Sea Snake
Killer Karaoke - Karaoke Singer Gets Dunked in a Tank of Snakes
This is What Snake Venom Does to Blood!
Snake befriends its hamster lunch in zoo
ZOMBIE SNAKE HEAD STILL ALIVE!

我知道这些值是带有一些奇怪字符的字符串所以我的问题是......我的语法确实是错误的,如错误消息暗示或我是否需要使用除VARCHAR之外的其他数据类型?

谢谢!

2 个答案:

答案 0 :(得分:1)

尝试:

$title = mysql_real_escape_string($video['title']['$t']);

确保标题中的特殊字符被正确转义。

但是,最好转换为mysqli或PDO并使用预处理语句,而不是将字符串插入查询中。不推荐使用mysql扩展并且不维护。

答案 1 :(得分:1)

为巴马尔的答案提供更多的背景故事:

您永远不希望以您的方式直接将字符串插入查询中。请记住,最终运行查询的数据库将获得完全解析的字符串。这意味着它不知道什么是变量以及手动输入的内容。

例如:

$var = "that's not good";
$query = "SELECT * from phrases where phrases.content = '$var'"
echo $query;

会输出:

SELECT * from phrases where phrases.content = 'that's not good'

注意字符串在“那个”之后是如何结束的,并且结果查询的语法不正确。

我猜这是你的情况发生了什么,因为标题很容易引用它们。

mysql_real_escape_string所做的是它扫描字符串中的特殊字符并“逃避它们”(通常通过添加反斜杠),这样就不会意外地关闭你正在编写的查询,保证它安全包含在引号中。


当您编写要插入数据库的代码时,上述所有解释都非常重要。没有正确地对你的字符串进行sanatizing是一个主要的安全漏洞,并导致一种称为“SQL注入”的攻击。如果您的某个标题是“'; drop table users;”

,该怎么办?

现在你可以理解this XKCD comic.