0

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

因此,我尝试使用以下代码将数据插入到临时 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 ( original / official ) [ As seen on 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 之外的其他数据类型?

谢谢!

4

2 回答 2

1

尝试:

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

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

但是,最好转换为 mysqli 或 PDO 并使用准备好的语句,而不是将字符串插入查询中。mysql 扩展已弃用且未维护。

于 2013-05-27T00:05:36.027 回答
1

为 Barmar 的出色回答提供更多背景故事:

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

例如:

$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'

请注意字符串如何在“that”之后结束,并且生成的查询语法不正确。

我猜这就是您的情况,因为标题中容易出现引号。

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


当您编写代码以插入数据库时​​,上述所有解释通常非常重要。不正确地清理字符串是一个主要的安全漏洞,并导致一种称为“SQL 注入”的攻击。如果您的标题之一是“'; drop table users;”之类的怎么办?

好的一面是现在你可以理解这部 XKCD 漫画了。

于 2013-05-27T00:13:15.020 回答