Mysqli Prepared Statement problem - PullRequest
       2

Mysqli Prepared Statement problem

2 голосов
/ 02 августа 2011

Я использую расширение MYSQLI с подготовленными утверждениями, что я делаю, так это кодирование видео, кодирование работает, но у меня проблемы с MYSQL

Когда код достигает, я получаю 2 ошибки, ОДИН -

PHP Fatal error:  Call to a member function bind_param() on a non-object in /site.com/processor.php on line 108

ЗДЕСЬ SQL

    $sql = "UPDATE videos_to_edit SET status = 'finished' WHERE post_id = ?";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $stmt->close();

и когда я var_dump($stmt) показывает, что bool false. Я также заметил, что когда я кодирую другое видео, оно работает, но иногда оно не работает. (всегда ошибка mysql) Когда я закомментирую эту строку

 exec("$mencoder $temp_upload_dir$post_filename -o $temp_upload_dir$r_post_id.mp4 2>&1", $output);

, чем работает MYSQLI, но мне нужна эта строка для кодирования моего видео. Любые идеи, что я делаю не так?

set_time_limit(0);


if(!file_exists($pcp ."processor1")) {

    $sql = "SELECT post_id, filename, status FROM videos_to_edit WHERE status = 'pending' ORDER BY post_id ASC LIMIT 1";
    $stmt = $mysqli->prepare($sql);
    $stmt->execute();
    $stmt->bind_result($r_post_id, $post_filename, $status); 
    $stmt->store_result();
    $checker = $stmt->num_rows;
    $stmt->fetch();
    $stmt->close();
    $id = $r_post_id;
    //$video = null;

    if($checker >= 1 && $status != "encoding" && $status != "finished" && $status != "removed" ) {


        $sql = "UPDATE videos_to_edit SET status = 'encoding' WHERE post_id = ?";
        $stmt = $mysqli->prepare($sql);
        $stmt->bind_param('i', $r_post_id);
        $stmt->execute();
        $stmt->close();

        $ourFileName = $pcp ."processor1";
        $ourFileHandle = fopen($ourFileName, 'w') or die("can't open file");
        fclose($ourFileHandle);


        exec("$mencoder $temp_upload_dir$post_filename -o $temp_upload_dir$r_post_id.mp4 2>&1", $output);


        foreach($output as $error) {
            if(preg_match('/============ Sorry, this file format is not recognized\/supported =============/', $error)) {
                $error1 = "error";
                break;
            }
        }


        if(!isset($error1)) {

            exec("$mp4box $temp_upload_dir$r_post_id.mp4");

            exec("$mplayer $temp_upload_dir$r_post_id.mp4 2>&1", $video);

            foreach($video as $vidlenght) {
                if(preg_match('/ID_LENGTH=/', $vidlenght)) {
                    $duration = $vidlenght;
                    $duration = explode("=",$duration);
                    $duration = round($duration['1']);
                    break;
                }
            }

            $hms = sec2hms($duration);

            mkdir("$temp_upload_dir$r_post_id", 0700);

            $duration1 = round($duration / 15);

            for($b = 1; $b <= 15; $b++) {

            $time = $b * $duration1;

            exec("$ffmpeg -ss $time -i $temp_upload_dir$r_post_id.mp4 -r 1 -vframes 15 -y -s 190x143 -f image2 $temp_upload_dir/$r_post_id/$r_post_id-$b.jpg 2>&1", $mplayer);

            }

            $sql = "UPDATE videos_to_edit SET status = 'finished' WHERE post_id = ?";
            $stmt = $mysqli->prepare($sql);
            $stmt->bind_param('i', $id);
            $stmt->execute();
            $stmt->close();

            $sql = "INSERT INTO post_lenght (post_id, post_length, seconds) VALUES (?, ?, ?)";
            $stmt = $mysqli->prepare($sql);
            $stmt->bind_param('iss', $r_post_id, $hms, $duration);
            $stmt->execute();
            $stmt->close();

            $thumbdir1 = $temp_upload_dir . $r_post_id; 
            $thumbdest = $thumbdir.$r_post_id;

            $videotempdir = $temp_upload_dir . $r_post_id . ".mp4";
            $videodes = $videodir . $r_post_id . ".mp4";

            $videotempdirsrc = $temp_upload_dir . $post_filename;
            $videodessrc = $temp_upload_dir . "src/"    . $post_filename;

            full_copy($thumbdir1, $thumbdest);
            rename($videotempdir, $videodes );
            rename($videotempdirsrc, $videodessrc);

            recursiveDelete($thumbdir1);



            unlink($pcp ."processor1");

            unset($video);
            unset($hms);
            unset($vidlenght);
            unset($duration);

        } else {

            $sql = "UPDATE videos_to_edit SET status = 'error' WHERE post_id = ?";
            $stmt = $mysqli->prepare($sql);
            $stmt->bind_param('i', $r_post_id);
            $stmt->execute();
            $stmt->close();

            unlink($pcp ."processor1");
        }
    }
    exit;
}

Решение: у меня были эти переменные в my.cnf на

wait_timeout = 30
interactive_timeout = 60

я изменил их на

wait_timeout = 3600
interactive_timeout = 3600

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

1 Ответ

2 голосов
/ 02 августа 2011

Для начала сделайте это

$sql = "UPDATE videos_to_edit SET status = 'finished' WHERE post_id = ?";
$stmt = $mysqli->prepare($sql);
if(!$stmt = $mysqli->prepare($sql)) {
    echo $mysqli->error;
}


$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();

, чтобы узнать, что mysqli говорит о проблеме:)

UDPATE

Исходя из вашего комментария ниже, факта, что вы делаете кодирование видео (которое может занять много времени) и того факта, что тайм-аут по умолчанию для подключения mysqli составляет 30 секунд (если память мне не изменяет).

Я думаю, вполне вероятно, что ваше соединение истекло. Попробуйте увеличить время ожидания до часа.

$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 3600); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...