Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   PHP (https://forum.zone-game.info/forumdisplay.php?f=125)
-   -   не могу понять где ковырять (https://forum.zone-game.info/showthread.php?t=38293)

hoske 21.04.2015 21:05

не могу понять где ковырять
 
при открытии страницы в моем магазине с купленными товарами
выдает ошибку
PHP код:

Error Number1064

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.idWHERE s.user 1 ORDER BY s.date DESC

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

Line Number
188 



сам запрос вот такого вида
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;
    } 

Где копать не могу понять

Aquanox 21.04.2015 21:09

Re: не могу понять где ковырять
 
Цитата:

Сообщение от BFG13 (Сообщение 392828)
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 и уберите цикл-фильтр

hoske 21.04.2015 21:18

Re: не могу понять где ковырять
 
поле price имеется как в таблице work так и в таблице work_sales но я как понимаю этим запросом я вытаскиваю все из таблицы work_sales так как это должны отображаться купленные товары. Вопрос только как исправить все это?

Aquanox 21.04.2015 21:20

Re: не могу понять где ковырять
 
Цитата:

Сообщение от BFG13 (Сообщение 392831)
поле price имеется как в таблице work так и в таблице work_sales но я как понимаю этим запросом я вытаскиваю все из таблицы work_sales так как это должны отображаться купленные товары

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

Для отладки запросов пользуйтесь консолью либо explain в Navicat или любого другого GUI к MySQL.

hoske 21.04.2015 21:39

Re: не могу понять где ковырять
 
Проблема не решена вышел на файл вывода этой страницы и вот так он выглядит
PHP код:

<?php
        $months 
= array(
            
'01' => 'янв',
            
'02' => 'фев',
            
'03' => 'мар',
            
'04' => 'апр',
            
'05' => 'мая',
            
'06' => 'июн',
            
'07' => 'июл',
            
'08' => 'авг',
            
'09' => 'сен',
            
'10' => 'окт',
            
'11' => 'ноя',
            
'12' => 'дек'
        
);
        
        
$statuses = array(
            
'1' => 'Выбор автора',
            
'2' => 'Ожидает подтверждения автором',
            
'3' => 'Ожидает оплаты',
            
'4' => 'В работе',
            
'5' => 'Согласование',
            
'6' => 'Гарантийная поддержка',
            
'7' => 'Завершен',
            
'8' => 'Просрочен',
            
'9' => 'Завершен арбитражем'
        
);
        
?>
        <div class="tab">
            <div class="thead-tr">
                <div class="tab-date">Дата</div>
                <div class="tab-name">Название работы</div>
                <div class="tab-predmet">Стоимость</div>
                <div class="tab-name"></div>
            </div>
            
            <?php foreach ($works as $work) { ?>
            <div class="tr">
                <div class="tab-date">
                    <em><?php echo (isset($work->date)) ? date('H:i'$work->date) : date('H:i'$work->created); ?><br />
                    <?php echo (isset($work->date)) ? date('d'$work->date) . ' ' $months[date('m'$work->date)] : date('d'$work->created) . ' ' $months[date('m'$work->created)]; ?></em>
                </div>
                <div class="tab-name">
                    <a href="rabota/tema/<?php echo (isset($work->work)) ? $work->id $work->id?>/"><?php echo $work->name?></a>
                </div>
                <div class="tab-predmet"><?php echo $work->price?> руб.</div>
                <div class="">
                    <?php if ($work->status == 2) { ?>Не прошла модерацию.<br />Причина: <?php echo $work->reason?><?php ?>
                    <?php $date = (isset($work->date)) ? $work->date $work->created$limit $work->date 2592000?>
                    <?php if ($limit time()) { ?><a href="upload/rabotu/<?php echo $work->file?>">Скачать</a>&nbsp;(Доступна до: <?php echo date('d.m.Y H:i'$work->date  2592000); ?>)<?php ?>
                </div>
            </div>
            <?php ?>
        </div>



Текущее время: 01:41. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot