Как переписать эти DELETE и INSERT с mysqli на PDO php

197
17 августа 2018, 08:10

Необходимо переписать старый код на новый с использованием транзакций из PDO. Есть вот такая конструкция с DELETE:

    if ($month && $day && $year && $div) {
        $result_ok = dbq("DELETE FROM $dbtable[visit] WHERE id_worker='" . $ar[id] . "' AND sdate='" . date('Y-n-j', $date) . "'");
    }

И с INSERT:

    if ($month && $day && $year && $div) {
        $result_ok = dbq("INSERT INTO $dbtable[visit] (id, id_worker, sdate, sdate_int, status, hours, id_author, cdate)
 VALUES (NULL, '" . $ar[id] . "', '" . date('Y-n-j', $date) . "', '" . $date . "', '" . $f_visit[$ar[id]] . "', '" . $f_hours[$ar[id]] . "', '$user_id', '$now[time]')");
        $f_id = mysql_insert_id();
    }

Функция dbq:

// Выполнение запроса к БД, v.1.1
function dbq ($cmd)
{
    GLOBAL $dbq_msg,$numrows;
    $result = @mysql_query($cmd);
    if ($result) {
           if ($dbq_msg=="a") echo "<br><b>SQL Ok</b>: $cmd";
        $numrows=@mysql_numrows($result);
        } else {
        if ($dbq_msg=="e" or $dbq_msg=="a") echo "<br><b>SQL Error</b>: ".mysql_error();
        }
    return $result;
}

Как это правильно переписать на PDO, чтоб безопасно было и в случае чего не удалялось лишнего?

Answer 1

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

$a = "foo";
$b = "bar";
$sql = $_database->prepare('INSERT INTO `tablename` (a, b) VALUES (?, ?)');
$result = $sql->execute([ $a, $b ]);
// >> INSERT INTO `tablename` (a, b) VALUES ('foo', 'bar')

Подключение

$_database = new PDO('mysql:host=localhost;dbname=database', 'user', 'password');

Удаление

$sql = $_database->prepare('DELETE FROM '.$dbtable['visit'].' WHERE id_worker=? AND sdate=?');
$result = $sql->execute([
    $ar['id'],
    date('Y-n-j', $date)
]);

Добавление

$sql = $_database->prepare('INSERT INTO '.$dbtable['visit'].' (id, id_worker, sdate, sdate_int, status, hours, id_author, cdate) VALUES (NULL, ?, ?, ?, ?, ?, ?, ?)');
$result = $sql->execute([
    $ar['id'],
    date('Y-n-j', $date),
    $date,
    $f_visit[$ar['id']],
    $f_hours[$ar['id']],
    $user_id,
    $now['time']
]);
READ ALSO
Как создать временную блокировку?

Как создать временную блокировку?

Допустим надо заблокировать пользователя на 7 дней, вносим в бд дату окончания блокировки, и дату начала

175
Возврат данных в AJAX-запросе

Возврат данных в AJAX-запросе

В ajax-запросе я обрабатываю с помощью php-скрипта текст

212
Php вырезает параметры url при редиректе

Php вырезает параметры url при редиректе

как сделать чтобы php не обрезал параметры строки, сейчас после редиректа получается он обрезает конец строки и &site=123 не попадаетПодсказывают...

151
Ошибка в плагине CurrencyConverter в WP

Ошибка в плагине CurrencyConverter в WP

Как исправить ошибку cURL error 28: Connection timed out after 5000 milliseconds

180