2011-10-26 59 views
0

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

$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); 
    }; 
}; 

非常感谢。

+3

什么不行?预期产出是多少?实际输出是多少? – bos

+0

你不应该使用'mysql-fetch-assoc'吗? - http://php.net/manual/en/function.mysql-fetch-assoc.php – Smamatti

+0

似乎你需要做一些简单的调试 – 472084

回答

4

我看到的第一个问题是您在结果集中调用mysql_close() mid-script。删除呼叫:

mysql_close($shortcheck); 

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

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

mysql_close($shortget); 
+0

你是对的,在他解决这个问题后,他会遇到我所描述的问题,以及你发现的SQL注入的嫌疑。 – stivlo

1

是的,可以嵌套语句。

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

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

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

  • 使用两个MySQL连接,并指定与$link_identifier参数mysql_query (string $query [, resource $link_identifier ])
  • 运行第一个查询使用哪一个,救所有结果都会返回一个数组,然后运行其他查询,这样查询就不会重叠。仅当您的桌子不太大时才使用此选项。

迈克尔还建议检查您的$urloriginal已消毒与mysql_real_escape_string(),或者你面对SQL注入的风险。