У меня есть 90 000 зарегистрированных пользователей на моем веб-сайте, и я хотел бы удалить всех пользователей, у которых в качестве пароля используется «ze5fze56f4».

Я сделал этот сценарий, но он всегда выполнялся без удаления какой-либо строки и, так сказать, «0 пользователей удалено»

<?php

require "includes/db.php";

$x = 0;

for($i = 0; $i < 91000; $i++){

    $SQLcheckPassword = $odb -> prepare("SELECT password FROM users WHERE ID = :i");
    $SQLcheckPassword -> execute(array(":i" => $i));
    $SQLgetPassword   = $SQLcheckPassword -> fetchColumn();

    if(strpos($SQLgetPassword, "ze5fze56f4")){

        $x++;

        $SQLdeleteUser = $odb -> prepare("DELETE FROM users WHERE ID = :i");
        $SQLdeleteUser -> execute(array(":i" => $i));

    }

}

die("$x users removed");

?>

Я не понимаю, почему это не работает, но я знаю, что делаю это не самым простым способом.

Заранее спасибо за помощь.

1
Steph 4 Сен 2017 в 09:53

5 ответов

Лучший ответ

Если $SQLgetPassword равен "ze5fze56f4", strpos($SQLgetPassword, "ze5fze56f4") вернет 0 (начало строки). 0 интерпретируется как FALSE в логическом контексте, поэтому оператор if никогда не будет введен. Замена strpos простой старой проверкой равенства должна сработать, но, честно говоря, я не думаю, что это правильный путь. Вместо того, чтобы изобретать велосипед, просто позвольте базе данных сделать тяжелую работу за вас:

$SQLdeleteUser = $odb -> prepare("DELETE FROM users WHERE password = :s");
$SQLdeleteUser -> execute(array(":s" => "ze5fze56f4"));
0
Mureinik 4 Сен 2017 в 06:57

Забудьте скрипт, просто запустите одну инструкцию SQL:

DELETE FROM users WHERE password="ze5fze56f4";

(Примечание: Всегда делайте резервные копии перед выполнением больших команд, подобных этой. У меня, очевидно, нет доступа к вашей базе данных, и я не могу проверить или подтвердить это заранее, поэтому, прежде чем запускать ядерное оружие для своих пользователей, по крайней мере, запустите это как ВЫБОР или что-то.)

Следующее, что вы должны сделать, это прекратить хранить пароли. Вместо этого храните хеши с солями. В противном случае ваш сайт по умолчанию небезопасен, и из-за плохой практики безопасности будут скомпрометированы учетные записи на вашем сайте и другие.

0
Brad 4 Сен 2017 в 06:57

Может быть, вы должны просто попробовать

УДАЛИТЬ ИЗ пользователей, ГДЕ пароль = "ze5fze56f4"

0
acco93 4 Сен 2017 в 06:57

Вы можете попробовать просто следующим образом

$SQLdeleteUser = $odb -> prepare("DELETE FROM users WHERE password = :s");
$SQLdeleteUser -> execute(array(":s" => "ze5fze56f4"));
0
KMS 4 Сен 2017 в 07:03

Спасибо, я использовал if(strpos($SQLgetPassword, "ze5fze56f4") !== false), и это сработало.

0
Steph 4 Сен 2017 в 07:10