Неверный запрос - INNER JOIN - PullRequest
0 голосов
/ 20 марта 2009

Я получаю кучу неопределенных предупреждений индекса, когда я распечатываю свои данные из запроса SQL, когда я удаляю ВНУТРЕННИЕ СОЕДИНЕНИЯ, большинство предупреждений исчезают. Я не уверен, что является причиной этой ошибки.

Мой код здесь:

<?php
    $id      = $_GET['id'];
    $sql     = "SELECT * FROM updates INNER JOIN clients ON updates.c_id = clients.c_id INNER JOIN pages ON updates.page = pages.p_id INNER JOIN projects ON updates.p_id = projects.p_id WHERE u_id='$id' LIMIT 1";
    echo $sql;
    $result  = mysql_query($sql) or die(mysql_error());
    $row     = mysql_fetch_assoc($result);

    // put update_id in hidden form and pass it to the next page
    $u_id = $row['u_id'];
?>
<h4>Viewing update for <i><? echo $row['fname'] ." ". $row['lname']  ?></i> for their <i><a href="<? echo $row['p_url']; ?>" title="View <? echo $row['p_title']; ?>"><? echo $row['p_title']; ?></a> project</i></h4>
<h4><b>Posted on: </b> <? echo $row['date_submitted'] = date("F j, Y, g:i a"); ?></h4>

Есть идеи о том, что я могу сделать? Причина, по которой у меня ВНУТРЕННЕЕ СОЕДИНЕНИЕ для КЛИЕНТОВ, заключается в том, что там хранятся "fname" и "lname"

clients.c_id = updates.c_id

Где у меня есть: "p_url", "p_title", они хранятся в таблице PROJECTS, которая также:

clients.c_id = projects.c_id

Редактировать с новой проблемой

Мой код здесь:

$sql     = "SELECT 
    updates.u_id AS u_id,
    updates.date_submitted AS date_submitted,
    updates.deadline AS deadline,
    updates.description AS description,
    updates.priority AS priority,
    pages.page_name AS page_name,
    clients.fname AS fname,
    clients.lname AS lname,
    projects.p_url AS p_url,
    projects.p_title AS p_title,
    FROM updates INNER JOIN clients ON updates.c_id = clients.c_id INNER JOIN pages ON updates.page = pages.p_id INNER JOIN projects ON updates.p_id = projects.p_id WHERE u_id='$id' LIMIT 1";

Ошибка:

Не уникальная таблица / псевдоним: 'клиенты'

Ответы [ 3 ]

2 голосов
/ 20 марта 2009

Отредактированный ответ:

Ах, я неправильно предположил, что это связано с индексами SQL. Похоже, что это на самом деле ошибка PHP, связанная с тем, что вы пытаетесь распечатать элементы массива, которые не существуют.

Для всех ваших отпечатков, которые содержат элементы $row ($row['deadline'] и т. Д.), Вам необходимо убедиться, что на самом деле есть столбцы с именами, которые возвращаются вашим запросом. Если столбец с именем «крайний срок» отсутствует, то при попытке его печати будет выдано предупреждение.


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

Прежде всего, как указывает Бобинс, у вас есть возможность внедрения SQL. Первая строка должна быть:

$id      = intval($_GET['id']);

если $ id всегда будет целым числом, и mysql_real_escape_string(), если это может быть строка.

Во-вторых, SELECT * обычно плохая форма, особенно в случае с соединениями. Я не знаю точно, из каких таблиц поступают конкретные поля, но ваш запрос должен выглядеть примерно так, где вы выбираете только те поля, которые фактически собираетесь использовать:

$sql = "SELECT clients.fname, clients.lname, projects.p_url, projects.p_title, updates.date_submitted ".
        "FROM updates ".
            "INNER JOIN clients ON updates.c_id = clients.c_id ".
            "INNER JOIN pages ON updates.page = pages.p_id ".
            "INNER JOIN projects ON updates.p_id = projects.p_id ".
        "WHERE updates.u_id='$id' ".
        "LIMIT 1";

Далее $u_id устанавливается точно в то же значение, которое уже было $id, так что это своего рода бессмысленная переменная.

Наконец, в последней строке у вас есть:

<? echo $row['date_submitted'] = date("F j, Y, g:i a"); ?>

Я не уверен, что вы ожидаете от этого, но он назначит date("F j, Y, g:i a"); на $row['date_submitted'], а затем напечатает "true" или "1" или что-то в этом роде, это, вероятно, не то, что вы собирались.


Новейшая проблема: Вы оба пытаетесь выбрать из клиентов и присоединяетесь к клиентам, вы не можете сделать оба, по крайней мере, не предоставив одному из них псевдоним.

1 голос
/ 20 марта 2009

Я не думаю, что это как-то связано с SQL (но я могу ошибаться). Вы могли бы взглянуть на этот поток для начала.

0 голосов
/ 20 марта 2009

ВЫБРАТЬ * ИЗ ОБНОВЛЕНИЙ ВНУТРЕННИХ РЕЙТИНГОВ клиентов

Когда вы выбираете SELECT, вы получаете каждый столбец из обеих таблиц. Поскольку столбцы могут иметь одинаковые имена, имена столбцов, автоматически сгенерированные символом «*», начинаются с префикса имени таблицы. Таким образом, ваш ассоциативный массив будет содержать такие индексы, как:

updates.u_id
clients.c_id
...

Поэтому, когда вы пытаетесь получить доступ к массиву, используя имя столбца без префикса, например, «имя_страницы», происходит сбой, потому что этот индекс отсутствует.

Вы можете использовать полное имя столбца ('pages.page_name') или можете явно указать свои собственные имена столбцов, сказав:

SELECT updates.u_id AS u_id, pages.page_name AS page_name, ...
FROM updates JOIN client ...

u_id = '$ ID'

Упс, дыра в SQL-инъекции. Поздравляем, вы стали 1000-м победителем обязательной ссылки xkcd .

mysql_real_escape_string () ваш друг. (Еще лучше: параметризованные запросы mysqli.)

<? echo $ row ['deadline']; ?>

Ой, дыра в HTML-инъекции. htmlspecialchars () твой друг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...