Я хочу использовать цикл for, чтобы избежать дублирования идентификаторов, но я не могу выйти из цикла

#php #for-loop

#php #for-цикл

Вопрос:

Я написал следующий код, чтобы избежать дублирования идентификаторов, но я не могу выйти из цикла for.

 print $someid;
  

продолжает отображаться 0.

 <?php
        for (; ; ) {
            $sql = "SELECT COUNT * FROM user WHERE id = :id";
            $id =  sha1(uniqid(mt_rand(), true));
            $idcheck = $connect -> prepare($sql);
            $idcheck->bindParam(':id', $id, PDO::PARAM_STR);
            $idcheck -> execute();
            $someid = $idcheck -> rowCount();
            print $someid;
            if ($someid = 0) {
                break;
            } 
        }
?>
  

Как я могу выйти из цикла, только если дубликатов нет?

Комментарии:

1. $someid = 0 это присвоение, а не сравнение …

2. while(true) чаще встречается для бесконечных циклов

3. @Yourcommon Sense есть ли какие-либо проблемы с производительностью for(;;) ?

Ответ №1:

Проблема в условии if, вы не сравниваете значение с 0, вместо этого присваиваете ему, сделайте так,

 <?php
        for (; ; ) {
            $sql = "SELECT COUNT * FROM user WHERE id = :id";
            $id =  sha1(uniqid(mt_rand(), true));
            $idcheck = $connect -> prepare($sql);
            $idcheck->bindParam(':id', $id, PDO::PARAM_STR);
            $idcheck -> execute();
            $someid = $idcheck -> rowCount();
            print $someid;
            if ($someid == 0) {
                break;
            } 
        }
?>
  

Комментарии:

1. О, я был неосторожен. Спасибо.

Ответ №2:

В если вы присваиваете 0 $someid. присваиванию, возвращайте значение, которое является присваиванием (0 в данном случае, которое оценивается как false).

Используйте == вместо этого для сравнения двух значений.

Ответ №3:

Ваш код

 if ($someid = 0)
  

Должно быть

 if ($someid == 0)
  

Если проверка условия равна, нужны два знака равенства вместо одного

Ответ №4:

Вы всегда будете получать размер строки как 1, потому что даже если дубликатов нет, столбец будет показывать значение 0.

Вам нужно получить фактическое значение из столбца, а затем вам придется выполнить сравнение. Более того, вы присваиваете 0 вместо сравнения его с нулем.