Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
не могу понять где ковырять
#1
при открытии страницы в моем магазине с купленными товарами
выдает ошибку
PHP код:
<?php 
Error Number
: 1064

You have an error in your SQL syntax
; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS work_price FROM works_sales AS s LEFT JOIN works AS w ON (s.work = ' at line 1

SELECT s
.*, w.* AS work_price FROM works_sales AS s LEFT JOIN works AS w ON (s.work = w.id) WHERE s.user = 1 ORDER BY s.date DESC

Filename
: /var/www/hoske/data/www/site.ru/models/work.php

Line Number
: 188




сам запрос вот такого вида
PHP код:
<?php 
public function get_purchased($id)
{

$sql = "SELECT s.*, w.* AS work_price FROM works_sales AS s
LEFT JOIN works AS w ON (s.work = w.id)
WHERE s.user = "
. $id . "
ORDER BY s.date DESC"
;

$query = $this->db->query($sql);
$works = $query->result();
$result = array();
foreach(
$works as $work)
if(!empty(
$work->name))
$result[] = $work;

return
$result;
}

Где копать не могу понять
Ответ
#2
BFG13 Написал:
PHP код:
<?php 
$sql
= "SELECT s.*, w.name, w.price AS work_price, [ тут все остальные поля из w ]
FROM works_sales AS s
LEFT JOIN works AS w ON (s.work = w.id)
WHERE s.user = "
. $id . "
ORDER BY s.date DESC"
;
множеству полей w.* не присвоишь одно имя work_price, но если конкретное поле w.price то будет работать.

P.S. конкатенировать значения в запрос - зло великое (не повторяйте такое дома). пользуемся prepared statement и забываем про sql injection
Выполнение каких-либо операций по фильтрованию результата, которые можно вынести в запрос - тоже зло. Представьте себе если в таблице 1000000 записей и они будут обрабатываться этим:
Код:
$works = $query->result();
        $result = array();
        foreach($works as $work)
            if(!empty($work->name))
                $result[] = $work;
    
        return $result;
Добавьте эту проверку на w.name != "" в WHERE и уберите цикл-фильтр
for(;Forum.getPostCount() < Integer.MAX_VALUE; Forum.writeNewPost()); | TERA Video | GamezTERA Emu
Ответ
#3
поле price имеется как в таблице work так и в таблице work_sales но я как понимаю этим запросом я вытаскиваю все из таблицы work_sales так как это должны отображаться купленные товары. Вопрос только как исправить все это?
Ответ
#4
BFG13 Написал:поле price имеется как в таблице work так и в таблице work_sales но я как понимаю этим запросом я вытаскиваю все из таблицы work_sales так как это должны отображаться купленные товары

На практике использовать * (все поля etc.) стоит только в простейших SELECT запросах. Во всех остальных случаях не ленитесь писать полный список (нужных) полей. Это избавит от проблем после рефакторинга и возможных изменений имен полей и коллизий.

Для отладки запросов пользуйтесь консолью либо explain в Navicat или любого другого GUI к MySQL.
for(;Forum.getPostCount() < Integer.MAX_VALUE; Forum.writeNewPost()); | TERA Video | GamezTERA Emu
Ответ
#5
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)