Ошибка PHP INSERT, когда я не прикрепляю какой-либо файл при загрузке - PullRequest
1 голос
/ 10 марта 2011

У меня ошибка при вставке некоторого содержимого в базу данных Postgresql, когда я не прикрепляю какой-либо файл. У меня есть форма с некоторыми входными данными, которые я вставляю в одну таблицу, и один вход для загрузки нескольких файлов и некоторой информации в другую таблицу.

Ошибка при пустом вводе загрузки:

Неустранимая ошибка: вызов функции-члена prepare () для необъекта в C: \ wamp \ www \ arn \ upload.php в строке 60

ЛИНИЯ 60: $ sth = $ dbh-> prepare ("ВСТАВИТЬ INTO arn_info (arn, modelos, familias, problemma, solucao) VALUES (?,?,?,?,?)") ;

МОЯ ФОРМА:

<?php
$sth = $dbh->query("SELECT * FROM arn_info");

    $sth->setFetchMode(PDO::FETCH_ASSOC);

    if($sth){
        $row = $sth->fetch();

        echo '<form method="post" action="upload.php" enctype="multipart/form-data" >';
        echo '<input type="hidden" name="id" />';
        echo 'ARN: <input type="text" name="arn" /><br />';
        echo 'Familias: <input type="text" name="familias" /> <br />';
        echo 'Problema: <textarea class="tinymce" name="problema" cols="30" rows="10">';
        echo '</textarea>';
        echo 'Solução: <textarea class="tinymce" name="solucao" cols="30" rows="10">';
        echo '</textarea>';

        echo '<input type="hidden" name="MAX_FILE_SIZE" value="2000000">';
        echo 'Anexos: <input name="userfile[]" type="file" class="multi" id="userfile">';

        echo '<input name="upload" type="submit" class="box" id="upload" value="ADD ARN">';
        echo '</form>';

     }
?>

МОЙ ЗАГРУЗИТЬ И ВСТАВИТЬ PHP:

<?php

if(isset($_POST['upload']))
{
    $uploadDir = 'uploads/';

    $fileArn = $_POST['arn'];
    $id = $_POST['id'];
    $arn = $_POST['arn'];
    $modelos = $_POST['modelos'];
    $familias = $_POST['familias'];
    $problema = $_POST['problema'];
    $solucao = $_POST['solucao'];

    foreach ($_FILES["userfile"]["error"] as $key => $error)
    {      
        if ($error == UPLOAD_ERR_OK)
        {           
            $fileName = $_FILES['userfile']['name'][$key];
            $tmpName = $_FILES['userfile']['tmp_name'][$key];
            $fileSize = $_FILES['userfile']['size'][$key];
            $fileType = $_FILES['userfile']['type'][$key];

            $folderName = $_POST['arn'] . "/";

            if (!file_exists ( $uploadDir . $folderName )) {
            $arnFolder = mkdir($uploadDir . $folderName, 0777);
            }

            $filePath = $uploadDir . $folderName  . basename($fileName);

            $result = move_uploaded_file($tmpName, $filePath);

            if (!$result) {
            echo "Error adding Files";
            exit;
            }

            include 'includes/connection.php';

            $fileName = addslashes($fileName);
            $filePath = addslashes($filePath);

            if (!file_exists ($fileName)) {

            $info = array ($fileName , $fileSize , $fileType , $filePath , $fileArn );

            $sth = $dbh->prepare("INSERT INTO upload2 (name, size, type, path , id_arn ) VALUES ( ? , ? , ? , ? , ? )");
            $sth->execute($info);
            }
        }

        } //END OF LOOP

        $parametros = array($arn,$modelos,$familias,$problema,$solucao);

        $sth = $dbh->prepare("INSERT INTO arn_info (arn , modelos , familias , problema , solucao) VALUES ( ? , ? , ? , ? , ? )");

        $sth->execute($parametros); 

        if($sth){
            header("location: admin.php?inserted=1");
        }
}
?>

Если я прикрепляю один или несколько файлов, все работает отлично!

Спасибо

Ответы [ 3 ]

1 голос
/ 10 марта 2011

Определение $dbh нигде не найдено в вашем файле. Таким образом, переменная не существует, и вы не можете вызвать метод prepare() для нее.

1 голос
/ 10 марта 2011

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

<?php

include 'includes/connection.php';

if(isset($_POST['upload']))
{
    $uploadDir = 'uploads/';

    $fileArn = $_POST['arn'];
    $id = $_POST['id'];
    $arn = $_POST['arn'];
    $modelos = $_POST['modelos'];
    $familias = $_POST['familias'];
    $problema = $_POST['problema'];
    $solucao = $_POST['solucao'];

    foreach ($_FILES["userfile"]["error"] as $key => $error)
    {      
        if ($error == UPLOAD_ERR_OK)
        {           
            $fileName = $_FILES['userfile']['name'][$key];
            $tmpName = $_FILES['userfile']['tmp_name'][$key];
            $fileSize = $_FILES['userfile']['size'][$key];
            $fileType = $_FILES['userfile']['type'][$key];

            $folderName = $_POST['arn'] . "/";

            if (!file_exists ( $uploadDir . $folderName )) {
            $arnFolder = mkdir($uploadDir . $folderName, 0777);
            }

            $filePath = $uploadDir . $folderName  . basename($fileName);

            $result = move_uploaded_file($tmpName, $filePath);

            if (!$result) {
            echo "Error adding Files";
            exit;
            }

            $fileName = addslashes($fileName);
            $filePath = addslashes($filePath);

            if (!file_exists ($fileName)) {

            $info = array ($fileName , $fileSize , $fileType , $filePath , $fileArn );

            $sth = $dbh->prepare("INSERT INTO upload2 (name, size, type, path , id_arn ) VALUES ( ? , ? , ? , ? , ? )");
            $sth->execute($info);
            }
        }

        } //END OF LOOP

        $parametros = array($arn,$modelos,$familias,$problema,$solucao);

        $sth = $dbh->prepare("INSERT INTO arn_info (arn , modelos , familias , problema , solucao) VALUES ( ? , ? , ? , ? , ? )");

        $sth->execute($parametros); 

        if($sth){
            header("location: admin.php?inserted=1");
        }
}
?>
1 голос
/ 10 марта 2011

Неустранимая ошибка: вызов функции-члена prepare () для необъекта в C: \ wamp \ www \ arn \ upload.php в строке 60

Кажется, ваш $ sth не объект. Если вы хотите увидеть более информативное сообщение, вам нужно сообщить PDO, что вы действительно хотите видеть ошибки. Попробуйте следующее (возможно, в файле «connection.php»):

<?php
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

Это обеспечит вывод PDO сообщения.

...