2011-10-26 11 views
0

私はこのコードを持っています。主に私のサイトのショールルを作成するためのものです。しかし、私は単にそれを働かせることはできません。それに間違ったことがありますか?もう1つの中でwhile()を実行してもよろしいですか?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()中スクリプトを呼び出していることです。コールを削除します。

mysql_close($shortcheck); 

mysql_close()は、リソースリンク(データベース接続)で呼び出すことを目的としています。クエリ結果のリソースではありません。スクリプトが終了すると暗黙的に呼び出されるため、特定のメモリ要件がない限り、呼び出す必要はありません。私はあなたがmysql_free_result()に電話をかけようとしていると思いますが、これも暗黙のうちに呼び出され、メモリを管理する必要がなければ呼び出す必要はありません。

この呼び出しは、MySQLリソースリンクを終了していないので、後で削除してください。

mysql_close($shortget); 
+0

あなたが正しいです、彼はこれを解決した後、私が説明した問題と、あなたが発見したSQLインジェクションの疑いを経験します。 – stivlo

1

はい、whileステートメントをネストすることはOKです。

最初に気付かなかった主な問題は、クエリの途中で接続を終了し、すべてのmysql_closeステートメントを削除することです。

しかし、これを解決した後は、MySQL接続を1つしか使用していないため別の問題に直面します.2番目のクエリは最初のクエリのすべての結果を失います。最初にelseブランチが実行されます。

あなたは「は、2つのオプションのいずれかを選択することができ、それを動作させるには:

  • 使用2 MySQL接続を、そしてmysql_query (string $query [, resource $link_identifier ])
  • は、最初のクエリを実行$link_identifierパラメータを使用するかを指定し、保存しますすべての結果が配列に格納され、次に他のクエリが実行されるため、クエリは重複しません。このオプションは、テーブルが大きすぎない場合にのみ使用してください。

マイケルも$urloriginalmysql_real_escape_string()でサニタイズされていることを確認するか、SQLインジェクションの危険性があります。

関連する問題