0

私はこのコードを持っています。主に、私のサイトのショート URL を作成するためのものです。しかし、私は単にそれを機能させることができません。何かおかしくないですか?別の中で while() を実行しても問題ありませんか?

$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()最初の問題は、結果セットに対して mid-script を呼び出していることです。呼び出しを削除します。

mysql_close($shortcheck);

mysql_close()リソース リンク (データベース接続) で呼び出されることを意図しています。クエリ結果リソースではありません。スクリプトの終了時に暗黙的に呼び出されるため、特定のメモリ要件がない限り、呼び出す必要はまったくありません。を呼び出すつもりだと思いますがmysql_free_result()、これも暗黙的に呼び出され、メモリを管理する必要がない限り呼び出す必要はありません。

この呼び出しは MySQL リソース リンクを閉じていないため、後で削除します。

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

はい、while ステートメントをネストしても問題ありません。

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

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

機能させるには、次の 2 つのオプションのいずれかを選択できます。

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

$urloriginalMichael はまた、 でサニタイズされているmysql_real_escape_string()か、SQL インジェクションのリスクに直面していることを確認することを提案しました。

于 2011-10-26T17:54:03.907 に答える