Ответы пользователя по тегу PHP
  • Нормально ли сделал тестовое задание на PHP (числа Фибоначчи)?

    @FirststepsRu
    $inputNumbers = [3279, 920, 4181, 8, 337, 13, 918, 4923, 1,
        4448, 8, 4756, 4012, 7467, 89, 21, 9238, 2326, 6453, 89, 4606,
        3413, 3, 9950, 2098, 8579, 4914, 7204, 8875
    ];
    $max_val = max($inputNumbers);
    $result_sum = 0;
    $fib_prev_prev = 0;
    $fib_prev = 1;
    $fib_temp = $fib_prev_prev + $fib_prev;
    for ($i = 0; $fib_temp <= $max_val; $i++) {
    	$found = 0;
    	$fib_temp = $fib_prev_prev + $fib_prev;
    	$fib_prev_prev = $fib_prev;
    	$fib_prev = $fib_temp;
    	if (array_search($fib_temp, $inputNumbers)) {
    		$found = 1;
    		$result_sum += $fib_temp;
    	}
    	echo $i," - ",$fib_temp, ($found==1 ? " found":""),"\n";
    }
    echo "Result sum ", $result_sum, "\n";

    Сначала я хотел сказать, что реализовали не айс. Подумал, что если в исходном массиве сделать очень большое число, то генерируемый массив сожрет всю память :) Но потом долго смеялся, что уже на 90 числе было переполнение 64-бит и тип стал float. Ведь по большому счету Фибоначчи почти что степень двойки. Никакого такого супер массива сгенерить не получится. Ваш код работает, и мой тоже. Даже не берусь оценивать чей лучше. Хотелось бы увидеть мнение общественности. Мне кажется у меня подход проще.
    0 - 1 found
    1 - 2
    2 - 3 found
    3 - 5
    4 - 8 found
    5 - 13 found
    6 - 21 found
    7 - 34
    8 - 55
    9 - 89 found
    10 - 144
    11 - 233
    12 - 377
    13 - 610
    14 - 987
    15 - 1597
    16 - 2584
    17 - 4181 found
    18 - 6765
    19 - 10946
    Result sum 4316

    Возможно по заданию надо это все затолкнуть в массив ? Но чето сформулировано не очень конкретно.
    Ответ написан
  • DELETE FROM list WHERE id = 'id строки в списке дел'. Как мне указать этот id?

    @FirststepsRu
    Ошибка в генерации URL для удаления
    <a href="delete.php?id=notesDelete=' . $row['id']  . '">

    Тут ошибочное id=notesDelete=N. По коду delete.php должно быть delete.php?notesDelete=N
    Но скорее всего хотелось сделать что-то типа
    echo "<a href=delete.php?id=",$row['id'],"&notesDelete=1><button>delete</button></a>";

    Тогда delete.php мог бы выглядеть так
    if (!isset($_GET['id'])) die("Error: not found id parameter");
    $id = intval($_GET['id']);
    if ($id == 0) die("Error: wrong id parameter value");
    if (isset($_GET['notesDelete'])) {
          $dbc = mysqli_connect('localhost', 'root', '', 'notes') or die('Connect error...');
          $query = "DELETE FROM note WHERE id = ".$id;
          $result = mysqli_query($dbc, $query);
          mysqli_close($dbc);
    } else {
          die("Error: no any action found");
    }

    Хотелось сделать важное замечание для начинающего. Ваш изначальный код не защищен от так называемых SQL инъекций. Вот пример кода
    $id = intval("SELECT nothing"); var_dump($id);
    $id = intval("1312; DELETE something"); var_dump($id);
    $h = "DELETE FROM note WHERE id = '$id'";
    var_dump($h);
    $id = "10'; DROP DATABASE mysql; SELECT * FROM note WHERE id='1";
    $h = "DELETE FROM note WHERE id = '$id'";
    var_dump($h);

    Выведет
    int(0)
    int(1312)
    string(34) "DELETE FROM note WHERE id = '1312'"
    string(80) "DELETE FROM note WHERE id = '10'; DROP DATABASE mysql; SELECT * from note id='1'"

    То есть если злоумышленник подставит в URL текст с DROP DATABASE то сможет нарушить работу программы или получить какие-то секретные данные.
    Я в коде продемонстрировал как можно от этого себя обезопасить, это принудительно привести тип входных данных к требуемому для работы, в данном случае к целому числу intval(). Таким образом все непонятное будет обрезано или пребразовано к 0. Для строковых выражений обязательно применять экранирование с помощью mysqli_real_escape_string().
    Но более лучшей практикой в таком случае будут так называемые "подготовленные запросы SQL" о создании которых упомянул alexalexes, но не пояснил почему так надо делать.
    Ответ написан
    1 комментарий