2015-03-25 4 views
1

У меня есть база данных, и я пытаюсь загрузить изображение на нее. База данных называется «blob» и имеет 3 поля. id, имя и изображение, с изображением, установленным как blob. При попытке загрузить изображение я получаю сообщение об ошибке, о котором я не знаю. Ниже мой код.PHP Загрузить изображение в базу данных mysql с помощью PDO?

<?php 
include ("dbConnect.php"); 
?> 

<form action="imageuploadtest.php" enctype="multipart/form-data" method="post"> 
<input name="image" type="file"><input name="submit" type="submit" value="Upload"> 
</form> 

<?php 

if(isset($_POST['submit'])) 
{ 

    $imageName = $_FILES["image"]["name"]; 
    $imageData = file_get_contents($_FILES["image"]["tmp_name"]); 
    $imageType = $_FILES["image"]["type"]; 

    if(substr($imageType,0,5)=="image") 
    { 
    $dbQuery = $db->prepare("INSERT INTO blob (name, image) VALUES ('$imageName', '$imageData')"); 
    $dbQuery->execute(); 
    } 
    else 
    { 
    echo "only images are allowed"; 
    } 
} 
?> 

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

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters' in N:\ftp\compc\d12ac1\FlightsFromNI\imageuploadtest.php:23 Stack trace: #0 N:\ftp\compc\d12ac1\FlightsFromNI\imageuploadtest.php(23): PDO->prepare('INSERT INTO blo...') #1 {main} thrown in N:\ftp\compc\d12ac1\FlightsFromNI\imageuploadtest.php on line 23. 

Любая помощь будет оценена по достоинству. Благодарю.

EDIT: изменили ли мое имя таблицы с blob на imgupload, но все равно получите такое же сообщение об ошибке?

+1

'blob' - зарезервированное слово в mysql. Вам придется приложить имя таблицы в обратном направлении. Лучше избегать использования зарезервированных слов в качестве имен таблиц или столбцов. –

+0

вы не используете 'PDO' правильно и подпадают под SQL-инъекции в том виде, в котором вы его используете. – cmorrissey

+0

, и если вы действительно хотите использовать «blob» в качестве имени вашей таблицы, измените его в своем запросе на «INSERT INTO' 'blob \' ... » – D3F

ответ

1

Это не о блобе. Речь идет о двоичных данных. Попробуйте использовать эту линию (но она также может не работать):

$db->prepare("INSERT INTO blob (name, image) VALUES ('$imageName', " . $db->quote($imageData) . ")"); 

Кроме того, ваш запрос не SAFE (для хакеров), вы должны дезинфицировать все входные данные в вашу базу данных. PDO имеет большую поддержку подготовленных инструкций.

+0

Спасибо, это работает. Посмотрите также, как сделать запрос более безопасным. – OUDK

+0

Хорошая работа на этом. –

+0

@OUDK Не забудьте отметить этот ответ как правильный, чтобы отметить его как решение. Вот как http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work, если вы не знаете. –

5

blob является MySQL зарезервированное слово

Либо переименовать таблицу на что-то другое, или использование клещей вокруг него:

INSERT INTO `blob` ... 

Nota: Это обычно лучше хранить файлы в папках и ma ke ссылку на файл, а не хранение двоичных данных в таблице. Это в конечном итоге резко увеличит размер вашей базы данных.

Смежные вопросы