0

すでに短縮されたレコードに関連するリンクを返す代わりに、mysqlで重複するエントリを検証する際にいくつかの問題が発生し、新しいレコードが作成されます。これが発生している理由は何ですか?これがコードです

$url = get_magic_quotes_gpc() ? stripslashes(trim($_REQUEST['cf_url'])) : trim($_REQUEST['cf_url']);

function remove_http($url) {
   $disallowed = array('http://', 'https://');
   foreach($disallowed as $d) {
      if(strpos($url, $d) === 0) {
         return str_replace($d, '', $url);
      }
   }
   return $url;
}
$id = rand(10000,99999);  
$short = base_convert($id, 20, 36);

$short_url = $short;
$private_url = md5($short);

$result = mysql_query("SELECT * FROM ' . DB_TABLE . ' WHERE original_url = ".mysql_real_escape_string(remove_http($url))."");
$num_rows = mysql_num_rows($result);

if ($num_rows > 0) {

$results = mysql_query("SELECT * FROM ' . DB_TABLE . ' WHERE original_url = ".mysql_real_escape_string(remove_http($url))."");
$object = mysql_fetch_assoc($results);
echo "http://" . BASE_HREF . $object['short_url'];

} else {

mysql_query('LOCK TABLES ' . DB_TABLE . ' WRITE;');
mysql_query('INSERT INTO ' . DB_TABLE . ' (original_url, short_url, private_url, created_on, created_by) VALUES ("' .mysql_real_escape_string(remove_http($url)) . '", "' . $short_url . '", "' . $private_url . '", "' . time() . '", "' . mysql_real_escape_string($_SERVER['REMOTE_ADDR']) . '")');
mysql_query('UNLOCK TABLES');

echo "http://" . BASE_HREF . $short_url;
}


mysql_close();
4

2 に答える 2

1

以下のコードの最初のインスタンスでクエリが失敗する可能性があると思います

$result = mysql_query("SELECT * FROM ' . DB_TABLE . 
' WHERE original_url = ".mysql_real_escape_string(remove_http($url))."");
$num_rows = mysql_num_rows($result);

値として original_url がstringあるため、一重/二重引用符で渡す必要があるため、以下のコードを試してください

$result = mysql_query("SELECT * FROM " . DB_TABLE .
" WHERE original_url = '".mysql_real_escape_string(remove_http($url))."'") 
or die("Error in SQL ".myql_error());
$num_rows = mysql_num_rows($result);

また、0 を超えるレコードが見つかった場合は、同じデータを取得する必要はありません。以前にクエリを実行したリソースを利用して、必要なデータを取得して短い URL を返すことができます。

于 2013-02-07T05:07:57.793 に答える
0

mysql_ *が廃止されたため、PDOですべてを書き直して正常に動作するようになりました。

于 2013-02-07T17:50:37.030 に答える