Попытка вернуть набор записей с помощью PHP и MySQL (внутреннее соединение)

#php #mysql

#php #mysql

Вопрос:

Я новичок в PHP / MySQL, пожалуйста, потерпите меня. Я пытаюсь заставить PHP написать таблицу, которая возвращает список записей из таблицы объединения. Оператор SQL отлично работает, когда я запускаю запрос, но я не знаю, как правильно написать функцию.

SQL-оператор, который работает:


 SELECT members.nick_name, assets.asset_desc, shares.asset_cost, shares.percent_owner
          FROM 
            (shares INNER JOIN assets
            ON shares.asset_ID = assets.asset_ID)
            INNER JOIN members
            ON shares.member_ID = members.member_ID
            WHERE shares.member_ID = $member_ID"
 

Мои функции:


 function get_shares_by_member($member_ID) {
global $db;
$query = "SELECT members.nick_name, assets.asset_desc, shares.asset_cost, shares.percent_owner
          FROM 
            (shares INNER JOIN assets
            ON shares.asset_ID = assets.asset_ID)
            INNER JOIN members
            ON shares.member_ID = members.member_ID
            WHERE shares.member_ID = $member_ID";
$share_result = $db->query($query);
$share_result = $share_result->fetch();
return $share_result;
}

function get_shares() {
global $db;
$query = "SELECT * FROM shares";
$share = $db->query($query);
$shares_table = $share->fetch();
return $share;
}
 

Мои действия:

 if (isset($_POST['action'])) {
$action = $_POST['action'];
} else if (isset($_GET['action'])) {
$action = $_GET['action'];
} else {
$action = 'list_shares';
}

if ($action == 'list_shares') {
if (!isset($member_ID)) {
    $member_ID = 0;
}
$shares = get_shares_by_member($member_ID);
$share = get_shares();
}
 

Вот моя таблица:


 <table>
<tr>
    <th>Nick Name</th>
    <th>Asset Description</th>
    <th>Asset Cost</th>
    <th class="right">% Ownership<th>
    <th>amp;nbsp;</th>
</tr>
<?php foreach ($shares_table as $share) : ?>
<tr>
    <td><?php echo $share['nick_name']; ?></td>
    <td><?php echo $share['asset_desc']; ?></td>
    <td><?php echo $share['asset_cost']; ?></td>
    <td class="right"><?php echo $share['percent_owner']; ?></td>
    <td>amp;nbsp;</td>
</tr>
<?php endforeach; ?>
</table>
 

Я знаю, что это много вопросов, но я боролся с этим в течение последних 3 дней. Любая помощь будет высоко оценена! Если кому-то нужна помощь с AD / Exchange, я был бы рад поделиться своими знаниями в этой области!

Спасибо!!

Комментарии:

1. Какую библиотеку БД вы используете? Что делает вызов ->fetch()? Выборка одной строки? весь результирующий набор?

2. @Progger: с какой проблемой вы столкнулись? Код не работает? Есть ошибки?

3. Пожалуйста, опубликуйте var_dump($share) и var_dump($shares) после того, как вы вызовете две функции, чтобы мы могли видеть, что они должны содержать.

4. @MarcB: предполагается, что функция fetch() возвращает весь набор результатов, а не одну строку. Что касается библиотеки DB, которую я использую, хотел бы я ответить на этот вопрос! Я опубликую код, который открывает соединение с mysql

5. @Abhay: Я продолжаю получать сообщение об ошибке, в котором говорится, что я не использую правильные параметры в своем операторе fetch(). Я опубликую точное сообщение в ближайшее время (извините, не перед моей машиной разработчика.

Ответ №1:

Из того, что я вижу здесь, это приведет к созданию пустой таблицы, в которой по ряду причин будет возвращено столько строк:

  • Ни один из столбцов, возвращаемых функцией get_shares_by_member, не является share_ID или asset_ID, поэтому эти столбцы не будут заполнены.
  • Вы ссылаетесь на percent_owner из $shares, который, предполагая, что это массив, поскольку вы используете его в цикле ‘foreach’, для ссылки на него потребуется индекс, или в противном случае он должен быть $share [‘percent_owner’]
  • Поле percent_owner будет помещено в столбец «стоимость активов» в настоящее время, поскольку не создано пустой ячейки для перемещения его в столбец «% владения», где, казалось бы, логично его иметь.

Основываясь на том, что вы опубликовали до сих пор, следующее должно соответствовать вашим потребностям:

 <table>
    <tr>
        <th>Nick Name</th>
        <th>Asset Description</th>
        <th>Asset Cost</th>
        <th class="right">% Ownership<th>
        <th>amp;nbsp;</th>
    </tr>
    <?php foreach ($shares as $share) : ?>
    <tr>
        <td><?php echo $share['nick_name']; ?></td>
        <td><?php echo $share['asset_desc']; ?></td>
        <td><?php echo $share['asset_cost']; ?></td>
        <td class="right"><?php echo $shares['percent_owner']; ?></td>
        <td>amp;nbsp;</td>
    </tr>
    <?php endforeach; ?>
</table>
 

Я бы рекомендовал изменить либо переменную $share в foreach, либо $share, которая устанавливается get_shares() . Лично говоря, я бы изменил последнее с

 $share = get_shares();
 

к чему-то вроде:

 $shares_table = get_shares();
 

поскольку он по существу содержит всю информацию из таблицы shares, предполагая, что функция уровня абстракции базы данных fetch() возвращает все результаты.

Также может возникнуть проблема, когда вы выполняете:

 $share = $db->query($query);
$share = $share->fetch();
 

Исходя из разных уровней абстракции базы данных, которые я видел, я бы ожидал, что fetch() будет выполняться как (с использованием ваших переменных)

 $share = $db->fetch();
 

Если fetch() требует передачи в него результата, то я бы ожидал, что код будет выглядеть примерно так:

 $share_result = $db->query($query);
$share = $db->fetch($share_result);
 

Комментарии:

1. Я внес изменения, которые вы предложили, по большей части. Я не был точно уверен, какую функцию вы имели в виду, когда спрашивали о fetch(), поскольку обе мои функции используют fetch() . Я отредактировал свой исходный пост с измененным кодом. Сейчас я не получаю никаких ошибок, но и не получаю никаких результатов. Есть ли инструмент, который я могу использовать для проверки моего кода по частям? Еще раз спасибо!

Ответ №2:

несколько моментов:

  1. вы уверены, что ваш запрос не возвращает никаких ошибок? Если есть ошибки, это может привести к сбою функции fetch()
  2. какой класс БД вы используете? Я бы посоветовал вам, пожалуйста, проверить, существует ли функция fetch() и какие параметры она принимает? Например, функция fetch() может быть вызвана как $share_result->fetch() или $db->fetch() или $db->fetch($share_result) и т.д.
  3. Возможно, я ошибаюсь, но кажется, что fetch() может всегда возвращать первую строку из результирующего набора. Возможно, вам может понадобиться выполнить fetch() в цикле для чтения всех результатов

Вы также можете попробовать использовать функции PHP по умолчанию. Вот фрагмент кода, который объясняет, как вы можете переписать свои функции, используя библиотеку mysql () PHP по умолчанию:

 mysql_connect('your host', 'your user', 'your password'); function get_shares_by_member($member_ID) {
    $output = Array();
    $query = "SELECT members.nick_name, assets.asset_desc, shares.asset_cost, shares.percent_owner
              FROM 
                (shares INNER JOIN assets ON shares.asset_ID = assets.asset_ID)
                INNER JOIN members ON shares.member_ID = members.member_ID
                WHERE shares.member_ID = $member_ID";
    $share_result = mysql_query($query);
    while ($row = mysql_fetch_assoc($share_result)) {
        $output[] = $row;
    }
    return $output;
}

function get_shares() {
    $output = Array();
    $query = "SELECT * FROM shares";
    $share = mysql_query($query);
    while ($row = mysql_fetch_assoc($share)) {
        $output[] = $row;
    }
    return $output; 
}
 

Надеюсь, что вышесказанное поможет. Пожалуйста, не стесняйтесь, дайте мне знать, если есть что-то непонятное.

Комментарии:

1. Привет @Abhay. Спасибо за ваш отзыв. Ошибка, которую я получаю сейчас, это «Предупреждение: mysql_fetch_assoc() ожидает, что параметр 1 будет ресурсным, логическим, заданным в C:xampphtdocstest.php в строке 11». Строка 11 выглядит так: «while ($row = mysql_fetch_assoc($share_result)) { $output[] = $row;»

2. Хммм! Это, скорее всего, означает, что $share_result ссылается не на результирующий набор MySQL, а, возможно, на FALSE (логическое значение), что означает, что запрос вернул ошибку. Не могли бы вы, пожалуйста, попробовать сделать echo $query; и посмотреть, как это выглядит?

3. Хорошо, я внес некоторые изменения, которые вы предложили, и я получаю гораздо лучшие результаты! Насколько я понимаю, синтаксис для ‘foreach’ — это «foreach ($array как $variable). $array в моей ситуации был бы «$share [‘nick_name’]», так что разве мой foreach не должен быть указан как: «foreach ($share как $variable)? Вы заставили меня поместить $ share в переменную часть. Я перевернул его, и теперь я получаю 8 копий моей записи, которые повторяются. Я могу поместить что угодно в переменную $, и это не имеет никакого значения — foreach ($share как $foo) или foreach ($share как $anything) оба возвращают 8 копий моей строки.

4. Мне очень жаль, Проггер, но я не смог уловить смысла твоего последнего комментария. Откуда берется foreach()? Что такое $share[‘nick_name’]? Что такое $share — это массив или результирующий набор MySQL?

5. посмотрите на мой код выше с надписью «Вот моя таблица». Там вы увидите команду foreach, которая должна создать html-таблицу, показывающую результаты. Этот массив равен $share. Есть ли в этом смысл? Это то, что я имел в виду в своем предыдущем посте.