@chifth

Как переделать запрос под Prepared Statement?

Вообщем история такая:
Использую на сайте скрипт проверки выгружаемых файлов по md5. Код:
$md5_hash = md5_file($_FILES["fail"]["tmp_name"], $raw_output = true);
$res_double = $db->query('SELECT * FROM `download__files` WHERE `md5hash`="' . $md5_hash . '"')->fetch();
$res_double2 = $db->query('SELECT * FROM `download__more` WHERE `md5hash`="' . $md5_hash . '"')->fetch();

Но иногда попадаются файлы, которые из-за $raw_output = true в хэш выдают спецчимволы, и скрипт вылетает с ошибкой SQL:
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?J!"' at line 1 in /srv/disk2/2498365/www/oldfag.cf/downloads/includes/files_upload.php:102 Stack trace: #0 /srv/disk2/2498365/www/oldfag.cf/downloads/includes/files_upload.php(102): PDO->query('SELECT * FROM `...') #1 /srv/disk2/2498365/www/oldfag.cf/downloads/index.php(141): require_once('/srv/disk2/2498...') #2 {main} thrown in /srv/disk2/2498365/www/oldfag.cf/downloads/includes/files_upload.php on line 102


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

UPD 1:
Вообщем как не пробовал - всегда проблема именно в том, что в RAW $md5_hash есть двойные кавычки, они то и портят весь скрипт.
Надо бы как-то абстрагировать значение в переменную... хотя я не силен в РНР.
Но другие же как-то работают с md5?
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
$md5_hash = md5_file($_FILES["fail"]["tmp_name"], true);

$stmt = $pdo->prepare('SELECT * FROM download__files WHERE md5hash = :md5hash');
$stmt->execute(['md5hash' => $md5hash]);
$result = $stmt->fetchColumn();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
сначала пишем волшебную функцию
function pdo($db, $sql, $params = null) {
        if (!$params)
        {
             return $db->query($sql);
        }
        $stmt = $db->prepare($sql);
        $stmt->execute($params);
        return $stmt;
}


И после этого пишем почти такой же код, как и был
$md5_hash = md5_file($_FILES["fail"]["tmp_name"], true);
$res_double = pdo($db, 'SELECT * FROM `download__files` WHERE `md5hash`=?', [$md5_hash])->fetch();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы