#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 вместо сравнения его с нулем.