0

我有这段代码,主要是为了为我的网站创建 shorurls。但我根本无法让它工作。你看到它有什么问题吗?在另一个里面运行一段时间()可以吗?

$urloriginal = $nt['fecha']."/".$nt['titulolower'];
mysql_query("SET NAMES 'utf8'");
$shortcheck = mysql_query("SELECT * FROM shorturls WHERE urloriginal = '".$urloriginal."' LIMIT 1");
while($urlitem = mysql_fetch_array($shortcheck)) {
    if($urlitem['urloriginal'] !=  "0") {
        echo "http://neutronico.com/u/".$urlitem['id'];
    } else {
        mysql_close($shortcheck);
        mysql_query("INSERT into shorturls (urloriginal) VALUES ('$urloriginal')") 
           or die(mysql_error());
        $shortget = mysql_query("SELECT * FROM shorturls WHERE urloriginal = '".$urloriginal."' LIMIT 1");
        while($urlitem2 = mysql_fetch_array($shortget)) {
            echo "http://neutronico.com/u/".$urlitem['id'];
        };
        mysql_close($shortget);
    };
};

非常感谢你。

4

2 回答 2

4

我看到的第一个问题是您在mysql_close()结果集上调用中间脚本。删除呼叫:

mysql_close($shortcheck);

mysql_close()旨在在资源链接(数据库连接)上调用。不在查询结果资源上。它在脚本退出时被隐式调用,因此您根本不需要调用它,除非您有特定的内存要求。我认为您打算调用mysql_free_result(),但这又是隐式调用的,除非您需要管理内存,否则无需调用它。

稍后,删除此调用,因为它不会关闭 MySQL 资源链接。

mysql_close($shortget);
于 2011-10-26T17:55:05.610 回答
1

是的,可以嵌套 while 语句。

我一开始没有发现的主要问题是您在查询中间关闭了连接,因此删除了所有mysql_close语句。

但是,在你解决了这个问题之后,你会面临另一个问题,因为你只使用一个 MySQL 连接,第二个查询会丢失第一个查询的所有结果,所以你可能停在第一行,或者第一次else分支被执行。

要使其工作,您可以选择以下两个选项之一:

  • 使用两个 MySQL 连接,并通过$link_identifier参数指定使用哪一个mysql_query ( string $query [, resource $link_identifier ] )
  • 运行第一个查询,将所有结果保存在一个数组中,然后运行其他查询,这样查询就不会重叠。仅当您的表不是太大时才使用此选项。

Michael 还建议检查您$urloriginal是否已经过 sanitized mysql_real_escape_string(),否则您将面临 SQL 注入的风险。

于 2011-10-26T17:54:03.907 回答