Не могу заставить работать код PHP - PullRequest
0 голосов
/ 26 октября 2011

У меня есть этот код, в основном он предназначен для создания сокращений для моего сайта. Но я просто не могу заставить его работать. Вы видите что-то не так с этим? Можно ли запустить 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);
    };
};

Большое спасибо.

Ответы [ 2 ]

4 голосов
/ 26 октября 2011

Первая проблема, которую я вижу, это то, что вы вызываете mysql_close() mid-script для набора результатов.Удалить вызов:

mysql_close($shortcheck);

mysql_close() предназначен для вызова по ссылке на ресурс - соединение с базой данных.Не на ресурсе результата запроса.Он вызывается неявно при выходе из скрипта, поэтому вам не нужно его вообще вызывать, если у вас нет особых требований к памяти.Я думаю, что вы намереваетесь вызвать mysql_free_result(), но опять же это вызывается неявно, и вам не нужно вызывать его, если вам не нужно управлять памятью.

Позже удалите этот вызов, так какон не закрывает ссылку на ресурс MySQL.

mysql_close($shortget);
1 голос
/ 26 октября 2011

Да, это нормально для вложенных операторов while.

Основная проблема, которую я сначала не обнаружил, заключается в том, что вы закрываете свое соединение в середине запроса, поэтому удалите все mysql_closeзаявления.

Однако, после того как вы решите это, вы столкнетесь с другой проблемой, так как вы используете только одно соединение MySQL, второй запрос теряет все результаты первого запроса, поэтому, вероятно, вы остановитесь на первомrow или в первый раз, когда выполняется ветка else.

Чтобы заставить ее работать, вы можете выбрать один из двух вариантов:

  • использовать два соединения MySQL иукажите, какой из них использовать с параметром $link_identifier mysql_query ( string $query [, resource $link_identifier ] )
  • , запустите первый запрос, сохраните все результаты в массиве, а затем запустите другие запросы, чтобы запросы не перекрывались.Используйте эту опцию, только если ваша таблица не слишком большая.

Майкл также предложил проверить, что ваш $urloriginal был продезинфицирован с помощью mysql_real_escape_string(), или вы столкнулись с риском внедрения SQL.

...