LINUX.ORG.RU

Ошибка при передаче двоичных данных в таблицу MySQL

 , , ,


0

1

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

<html>
  <head>
    <link rel="stylesheet" href="/css/style.css" type="text/css">
  </head>
  <body>
    <?php
    require_once '../../scripts/app_config.php';
    require_once '../../scripts/database_connection.php';

    $upload_dir = HOST_WWW_ROOT . "uploads/profile_pics/";
    $image_fieldname = "user_pic";
    $php_errors = array(
      1 => 'Превышен макс. размер файла, указанный в php.ini',
      2 => 'Превышен макс. размер файла, указанный в форме HTML',
      3 => 'Была отправлена только часть файла',
      4 => 'Файл для отправки не был выбран'
    );
    
    $first_name = trim($_REQUEST['first_name']);
    $last_name = trim($_REQUEST['last_name']);
    $email = trim($_REQUEST['email']);
    $bio = trim($_REQUEST['bio']);
    $facebook_url = str_replace("facebook.org", "facebook.com", trim($_REQUEST['facebook_url']));
    $position = strpos($facebook_url, "facebook.com");
    if($position === false){
      $facebook_url = "http://www.facebook.com/" . $facebook_url;
    }
    $twitter_handle = $_REQUEST['twitter_handle'];
    $twitter_url = "http://www.twitter.com/";
    $position = strpos($twitter_handle, "@");
    if($position === false){
      $twitter_url = $twitter_url . $twitter_handle;
    } else{
      $twitter_url = $twitter_url . substr($twitter_handle, $position + 1);
    }
    //Проверка отсутствия ошибки при отправке изображения
    ($_FILES[$image_fieldname]['error'] === 0)
    or handle_error("сервер не может получить выбранное вами изображение.", $php_errors[$_FILES[$image_fieldname]['error']]);
    /* Является ли этот файл результатом нормальной отправки? */
    @is_uploaded_file($_FILES[$image_fieldname]['tmp_name']) or handle_error("вы попытались совершить безнравственный поступок. Позор!", "Запрос на отправку: файл назывался " . "'{$_FILES[$image_fieldname]['tmp_name']}'");
    /* Действительно ли это изображение?  */
    @getimagesize($_FILES[$image_fieldname]['tmp_name']) or handle_error("вы выбрали файл для своего фото, который не является изображением. '{$_FILE[$image_fieldname]['tmp_name']}' не является файлом изображения.");

    $now = time();
    while(file_exists($upload_filename = $upload_dir . $now . '-' . $_FILES[$image_fieldname]['name'])){
      $now++;
    }
    
    $insert_sql = sprintf("INSERT INTO users (first_name, last_name, email, bio, facebook_url, twitter_handle) VALUES ('%s', '%s', '%s', '%s', '%s', '%s');",
			  $mysqli->real_escape_string($first_name),
			  $mysqli->real_escape_string($last_name),
			  $mysqli->real_escape_string($email),
			  $mysqli->real_escape_string($bio),
			  $mysqli->real_escape_string($facebook_url),
			  $mysqli->real_escape_string($twitter_handle)
    );
    
    $mysqli->query($insert_sql) or die($mysqli->error);
    $user_id = $mysqli->insert_id;

    /* Вставка изображения в таблицу images */
    $image = $_FILES[$image_fieldname];
    $image_filename = $image['name'];
    $image_info = getimagesize($image['tmp_name']);
    $image_mime_type = $image_info['mime'];
    $image_size = $image['size'];
    $image_data = file_get_contents($image['tmp_name']);
    $insert_image_sql = sprintf("INSERT INTO IMAGES (filename, mime_type, file_size, image_data) VALUES ('%s', '%s', '%d', '%s');",
				$mysqli->real_escape_string($image_filename),
				$mysqli->real_escape_string($image_mime_type),
				$mysqli->real_escape_string($image_size),
				$mysqli->real_escape_string($image_data));
    $mysqli->query($insert_image_sql) or die($mysqli->error);
    header("Location: show_user.php?user_id=". $user_id);
    exit();
    ?>
  </body>
</html>
Результат:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '31802', '-тут-вопросы-и-неопознанные символы-которые-лор-не-пропускает-Photoshop 3.0-и-тут-тоже' at line 1
Дополнительно прилагаю «database_connection.php» (в app_config пароли, сами понимаете, приложить не могу):
require_once 'app_config.php';
$mysqli = new mysqli(DATABASE_HOST, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_NAME);/* Константы из app_config */
if ($mysqli->connect_errno) {
  handle_error("возникла ошибка, связанная с подключением к базе данных, содержащей нужную информацию.", $mysqli->connect_error);
}
$mysqli->set_charset("utf8");
Кто поможет, буду очень благодарен)



Последнее исправление: sudoLife (всего исправлений: 1)
Ответ на: комментарий от goingUp

Ребят, закрываем тему, я идиот)

Написал IMAGES хотя у меня таблица images. Хотя странно, что он не говорил, что таблица не существует, когда использовалась $mysqli->real_escape_string, но сказал это, когда использовалась addslashes. Интересно...

sudoLife
() автор топика

стараюсь переводить все примеры на новую версию PHP

Зачем напрягаться, всё равно получается говнокод в духе php4

no-such-file ★★★★★
()

По-хорошему, вам нужен PDO с его PreparedStatement и привязкой параметров:

var $pdo = new PDO('...dsn...');
var $stmt = $pdo->prepare('INSERT INTO sometable VALUES(?, ?)');
$stmt->bindValue(1, 'value');
$stmt->bindValue(2, $file_data, PDO::PARAM_LOB);
$stmt->execute();

Типа такого.

sanwashere ★★
()
Ответ на: комментарий от sudoLife

Никогда не мешай логику и представление.

Никогда.

nihirash ★★★
()
Ответ на: комментарий от sudoLife

Рефлекторно после Java написал. «var» там не надо. Идея всё равно понятна.
Но сам «var» впосле легален - фактически это синоним «public».

sanwashere ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.