UPDATE `'.DB_PREFIX.'product` AS `p`
LEFT JOIN (
SELECT `t`.`sku`, MIN(`p`.`product_id`) AS `product_id`
FROM (
SELECT `sku`, MIN(`price`) AS `price`
FROM `'.DB_PREFIX.'product`
WHERE `quantity` != 0
GROUP BY `sku`
) AS `t`
JOIN `'.DB_PREFIX.'product` AS `p`
ON `p`.`sku` = `t`.`sku` AND `p`.`price` = `t`.`price`
WHERE `p`.`quantity` != 0
GROUP BY `t`.`sku`
) AS `i` ON `i`.`product_id` = `p`.`product_id`
SET `p`.`status` = (`i`.`product_id` IS NOT NULL)
Запрос я рекомендую упростить
[22-May-2023 13:00:40 Europe/Moscow] PHP Parse error: syntax error, unexpected end of file in /путь/до/скрипта/index.php on line 3
UPDATE `'.DB_PREFIX.'product` SET `p`.`status` = (`i`.`product_id` IS NOT NULL) WHERE {условие}
Notice: Trying to get property of non-object inЧтение ошибки внимательно может дать подсказку, особенно если понять что за проблема описана в ошибке.
я же написал, ошибка вот по этой строкеОчевидно это не так, читайте всю ошибку внимательно, в том числе смотрите на файл в котором она возникает, так же не лишним будет использовать нормальные IDE, с правильным отображением нумерации строк и подсветкой ошибок.
SET `p`.`status` = (`i`.`product_id` IS NOT NULL)
$this->db->query()
->rows; // <-- И она здесь
Метод query вернул совсем не объект, вот вам и ошибка.
Почему он при ошибке не выбрасывает исключение с понятным описанием произошедшего.
<?
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
ini_set('error_reporting', E_ALL);
class ControllerExtensionModuleDubli extends Controller {
public function index() {
$this->db->query('UPDATE `'.DB_PREFIX.'product` AS `p`
INNER JOIN (
SELECT `t`.`sku`, MIN(`p`.`product_id`) AS `product_id`
FROM (
SELECT `sku`, MIN(`price`) AS `price`
FROM `'.DB_PREFIX.'product`
WHERE `quantity` != 0
GROUP BY `sku`
) AS `t`
JOIN `'.DB_PREFIX.'product` AS `p`
ON `p`.`sku` = `t`.`sku` AND `p`.`price` = `t`.`price`
WHERE `p`.`quantity` != 0
GROUP BY `t`.`sku`
) AS `i` ON `i`.`product_id` = `p`.`product_id`
SET `p`.`status` = (`i`.`product_id` IS NOT NULL)')->rows;
echo "ok";
}
}
namespace DB;
final class MySQLi {
private $connection;
public function __construct($hostname, $username, $password, $database, $port = '3306') {
$this->connection = new \mysqli($hostname, $username, $password, $database, $port);
if ($this->connection->connect_error) {
throw new \Exception('Error: ' . $this->connection->error . '<br />Error No: ' . $this->connection->errno);
}
$this->connection->set_charset("utf8");
$this->connection->query("SET SQL_MODE = ''");
}
public function query($sql) {
$query = $this->connection->query($sql);
if (!$this->connection->errno) {
if ($query instanceof \mysqli_result) {
$data = array();
while ($row = $query->fetch_assoc()) {
$data[] = $row;
}
$result = new \stdClass();
$result->num_rows = $query->num_rows;
$result->row = isset($data[0]) ? $data[0] : array();
$result->rows = $data;
$query->close();
return $result;
} else {
return true;
}
} else {
throw new \Exception('Error: ' . $this->connection->error . '<br />Error No: ' . $this->connection->errno . '<br />' . $sql);
}
}
} else {
return true;
}
public function index() {
$query = 'UPDATE `'.DB_PREFIX.'product` AS `p`
INNER JOIN (
SELECT `t`.`sku`, MIN(`p`.`product_id`) AS `product_id`
FROM (
SELECT `sku`, MIN(`price`) AS `price`
FROM `'.DB_PREFIX.'product`
WHERE `quantity` != 0
GROUP BY `sku`
) AS `t`
JOIN `'.DB_PREFIX.'product` AS `p`
ON `p`.`sku` = `t`.`sku` AND `p`.`price` = `t`.`price`
WHERE `p`.`quantity` != 0
GROUP BY `t`.`sku`
) AS `i` ON `i`.`product_id` = `p`.`product_id`
SET `p`.`status` = (`i`.`product_id` IS NOT NULL)';
$response = $this->db->query($query)->rows;
if(is_object($response)){
echo 'Все ок '.$query.' вернул обьект '.PHP_EOL;
}else{
echo 'Все пропало! '.$query.' не вернул обьект! '.PHP_EOL;
}
echo "ok";
}
хорошо, но это не обьясняет почему возникает эта ошибка ) ведь она возникает не сразу, а примерно на половине обработанной базы. почему половину обрабатывает нормально, а потом вдруг ей перестает нравится ?Абсолютно бесполезно гадать почему, надо взять и посмотреть. Для начала добавить в ваш замечательный класс MySQLi команду для драйвера, позволяющую ему отдавать ошибки запросов:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
да там нет ошибки в бд.Сильно сомневаюсь. То что его нет в выводе не значит что его нет вообще. 99% ошибка в данных и драйвер тупо молчит, так как ему не давали слова.