LINUX.ORG.RU

Как в sqlite узнать о результате выполнения sql-запроса?

 , ,


0

1

Маленький скриптик на php каждый раз при запуске инсертит одну строку в таблицу базы данных sqlite, обычно работает нормально но при запуске с помощью cron выдает ошибку Fatal error: Call to a member function execute() on boolean

Я про уже хз что думать. Ведь вообще то работает если обновить страницу а с помощью cron такую ошибку выдает.

★★☆☆

Последнее исправление: Dimez (всего исправлений: 3)

Ну так понятно же, что объект, для которого вызывается execute() === FALSE. Обычно оно возвращается при ошибке, и значит ресурс не был получен, - скорее всего подключение (открытие файла) не удалось.
Предположу, что у вас там что-то вроде:

$pdo = new PDO("mydsn");
$stmt = $pdo->prepare("insert into mytable values(?, ?)");
$stmt->execute(1, "value");

Вот $stmt и не получает, например.

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 3)
Ответ на: комментарий от sanwashere
$data_datetime = date('d m H:i:s');
$db = new PDO("sqlite:data.db");
$query = "INSERT INTO status(page_id, datetime, url, header, indexed, md5) VALUES (1, '$data_datetime', '$data_url', '$data_header', '$data_indexed', '$data_md5')";
$st = $db -> prepare($query);
$st -> execute();

Как не удалось то?

XoFfiCEr ★★☆☆
() автор топика
Последнее исправление: XoFfiCEr (всего исправлений: 1)
Ответ на: комментарий от sanwashere

Как не удалось и почему именно c запуском по cron не удалось объясни толком.

XoFfiCEr ★★☆☆
() автор топика
Ответ на: комментарий от XoFfiCEr

1. У вас тут относительный пути к файлам. Рабочий каталог такой же, как и при вызове через HTTP?
2. Переменные $data_{url,header,indexed,md5} точно заполняются корректно? Если там проблемы, то prepare() может сильно огорчиться.

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 2)
Ответ на: комментарий от sanwashere

да нет там проблем, я ведь проверял вообще то.

XoFfiCEr ★★☆☆
() автор топика
Ответ на: комментарий от XoFfiCEr

У тут лучше использовать подстановку, раз уж подготавливаете запрос:

$query = "INSERT INTO status(page_id, datetime, url, header, indexed, md5) VALUES (?, ?, ?, ?, ?, ?)";
$st = $db->prepare($query);
$st->execute(1, $data_datetime, $data_url, $data_header, $data_indexed, $data_md5);

Или руками $st->bindValue(), если нужны иные типы, нежели строки.

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

хорошо спасибо попробую сейчас, минуту

XoFfiCEr ★★☆☆
() автор топика
Ответ на: комментарий от XoFfiCEr

С «boolean»?. Ну, остаётся сделать что-то типа:

error_reporting(E_ALL);

$data_datetime = date('d m H:i:s');
$db = new PDO("sqlite:data.db");
$query = "INSERT INTO status(page_id, datetime, url, header, indexed, md5) VALUES (?, ?, ?, ?, ?, ?)";
$st = $db->prepare($query);

var_dump($st, $data_datetime, $data_url, $data_header, $data_indexed, $data_md5);

$st->execute(array(1, $data_datetime, $data_url, $data_header, $data_indexed, $data_md5));

И смотреть на выхлоп.

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

вот вывод st в var_dump

object(PDOStatement)#2 (1) { [«queryString»]=> string(90) «INSERT INTO status(page_id, datetime, url, header, indexed, md5) VALUES (?, ?, ?, ?, ?, ?)» }

XoFfiCEr ★★☆☆
() автор топика
Ответ на: комментарий от XoFfiCEr

Да и точки зрения порядка дампа, то получается что вроде:

$data_datetime == 'avito.ru'
$data_url == '09 02 04:48:11'
$data_header == '200'
$data_indexed == '8 фев 2021 23:48:57 GMT'
$data_md5 == '46bdc35ce199eb4583ef805167bb2523'
Странно как-то.

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

С $st значит всё нормально. Остаются только значения параметров некорректные.

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

ну у меня просто такой порядок переменных. И делать то что?

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

object(PDOStatement)#2 (1) { [«queryString»]=> string(90) «INSERT INTO status(page_id, datetime, url, header, indexed, md5) VALUES (?, ?, ?, ?, ?, ?)» } array(3) { [0]=> string(5) «00000» [1]=> NULL [2]=> NULL }

XoFfiCEr ★★☆☆
() автор топика
Ответ на: комментарий от XoFfiCEr

Так работает же. Я вот на указанной ранее странице вижу «время сервера» == «09 02 05:04:24», что как бы намекает, что что-то там у вас работает.

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

послушай но если запускать его из cronа он не добавляет записи в таблицу и выдает ошибку, а записывать в csv совсем не весело.

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

Так если последний дамп указан для вызова из крона, то там INSERT происходит успешно (код нулевой). Или в 05:04:24 не через крон вызывалось?
И ошибка-то всё та же?

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

И да, я таки подозреваю, что рабочий каталог у вас другой и он создаёт новую пустую БД, и, не находя там таблицы, не может подготовить запрос.
Смените строку крона на:

cd ~/xofficer.ru/public_html/services/monitoring-content-changes && /usr/local/bin/php5.6 ~/xofficer.ru/public_html/services/monitoring-content-changes/avito-checker.php


Правда БД у вас всем ветрам открыта, но это уже другой вопрос.

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 2)
Ответ на: комментарий от XoFfiCEr

У вас по пути <домешний_каталог_веб_юзера>/xofficer.ru/public_html/services/monitoring-content-changes/data.db лежит заполненная БД. Она используется, если скрипт вызван через веб, т.к. рабочий каталог выставляется в <homedir>/xofficer.ru/public_html/services/monitoring-content-changes. Когда вызывается из крона, то никто вам данный каталог не выставляет. Приведённая мною строка будет работать, если у вас запись кронтаба занесена от того же пользователя, что и веб.
Скорее всего у вас сейчас имеется второй файл data.db в корне домашнего каталога.

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

В общем, логика PHP в вашем случае такая:
1. Вызов из веб http://xofficer.ru/public_html/services/monitoring-content-changes/avito-chec...
CWD = ~/xofficer.ru/public_html/services/monitoring-content-changes
new PDO(«sqlite:data.db») ищет в рабочем каталоге (CWD) => ~/xofficer.ru/public_html/services/monitoring-content-changes/data.db

Файл есть, таблица есть. Соответственно SQLite при prepare() видит таблицу и даёт $st (!== FALSE).

2. Вызов из крон с тем же пользователем ~/xofficer.ru/public_html/services/monitoring-content-changes/avito-checker.php:
CWD = ~
new PDO(«sqlite:data.db») ищет в рабочем каталоге (CWD) => ~/data.db

На первый раз файла нет, так что создаём новую пустую БД без таблиц. Соотвественно SQLite при prepare() не видит таблицы и не даёт вам $st (=== FALSE).

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 3)
Ответ на: комментарий от XoFfiCEr

В общем, если совсем лень, то в начале скрипта напишите:

chdir(dirname(__FILE__));
И будет вам счастье.
Это будет всегда предварительно менять текущий (рабочий) каталог на каталог скрипта, вне зависимости от способа запуска.

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

ура работает но последний вопрос а в какую базу данных будут инсертиться строки? в ту пустую что ли?

XoFfiCEr ★★☆☆
() автор топика
Ответ на: комментарий от ilinsky

ну в панели управления beget планировщик заданий, вкладка мастер заданий, сначала надо выбрать версию php или запрос или bash или perl

https://imgur.com/Gaz5naL.png

XoFfiCEr ★★☆☆
() автор топика
Ответ на: комментарий от XoFfiCEr

Завершено с кодом 255 это все ок?

Явно нет. Путь к файлу неверный в CRON

Сразу же написал. А «спасибо» не заслужил. Ты бы книгу какую по UNIX посмотрел и маны в Инете как VPS настроить. Только не дуйся. Ты же реально страдаешь на своем шареде. Питон низя, ниче низя на нем. Нафига ты им пользуешься?

Stack77
()
Ответ на: комментарий от Stack77

Я не дуюсь ничего такое, я просто незакончил еще мне теперь клиентские страницы делать с конкретными urlами. Техподдержка begetа сказала что да у них python 2 но я могу использовать docker там python 3.

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