Неоднозначное заявление PDO - Php? - PullRequest
1 голос
/ 11 апреля 2011

Итак, я пытаюсь получить все комментарии для определенного курса. То, как он сообщает, какой курс имеет какие комментарии, например, по адресу course.php? CID = 1563. CID - это идентификатор, который выполняет это различие.

Он продолжает выдавать эту фатальную ошибку: Фатальная ошибка: необработанное исключение 'PDOException' с сообщением 'SQLSTATE [23000]: Нарушение ограничения целостности: 1052 Столбец' cID ', где предложение неоднозначно' PDOStatement-> execute (Array ) # 1 выброшено на линию 42

Структура БД для (2) таблиц: tables

PHP:

<?php
// Get course information cID, prefix, code and dept info : name
$cID = filter_input(INPUT_GET, 'cID', FILTER_SANITIZE_NUMBER_INT);
if(!$cID) {
    echo "No cID specified.";
    exit;
}
$username = "###";
$password = "###";
$pdo2 = new PDO('mysql:host=localhost;dbname=####', $username, $password);
$pdo2->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sth2 = $pdo2->prepare('
    SELECT Co.info, Co.date
    FROM Course C, Comment Co
    WHERE C.cID = Co.cID
    AND cID = ?;
    ;');
$sth2->execute(array(
    $cID
));
?>

PHP Вызов выше:

<?php
                    // Did we get any *course detail*
                    if($sth2->rowCount() > 0) {
                        $row = $sth2->fetch(PDO::FETCH_ASSOC);
                        echo "<img class='left' style='margin:5px;' src='img/courseComment.png'/> <p> {$row['info']} </p>";
                        } else {
                        echo "No results.";
                    }
                unset($sth2);
                ?>

Почему это происходит? Если кто-то может помочь мне с объяснением и исправлением кода, это будет очень цениться. Также в URL-адресе указан идентификатор страницы.

Ответы [ 2 ]

6 голосов
/ 11 апреля 2011

Вы ссылаетесь на столбец cID, который существует в обеих таблицах. Обновите ваш запрос ($sth2), указав только одну из таблиц, например:

SELECT Co.info, Co.date
    FROM Course C, Comment Co
    WHERE C.cID = Co.cID
    AND C.cID = ?;
0 голосов
/ 11 апреля 2011

Я не понимаю (из вашего вопроса), почему вам вообще нужно ссылаться на таблицу курса.Данные, которые вы возвращаете, полностью из таблицы комментариев.Я предполагаю, что у вас есть предыдущий запрос, который извлекает информацию о курсе, и теперь вы получаете соответствующие комментарии.Если это правильно, то немного лучше версия вашего кода может быть:

$sth2 = $pdo2->prepare('
    SELECT Co.info, Co.date
    FROM Comment Co
    WHERE Co.cID = :id;
    ');

$sth2->bindParam( ':id', $cID, PDO::PARAM_INT );

$sth2->execute();

Я немного обеспокоен тем, что означают символы на вашем графике Visio, но если может быть несколько комментариев для одного курсавы бы хотели fetchAll(), а не fetch(), и вам нужно было бы перебрать полученный массив.Если на курс может быть только один комментарий, вы можете объединить этот запрос в предыдущий запрос с JOIN в поле cID.

...