我确信这是一个简单的解决方案,但到目前为止,我很难过......
所以我试图使用下面的代码将数据插入到临时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之外的其他数据类型?
谢谢!
答案 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.
了