Jump to content
  • 0

Проблема со сложным sql-запросом


Torawhite
 Share

Question

Здравствуйте! Функция получает параметр через адресную строку и делает выборку из БД. Если запрос ввожу с конкретными цифрами в phpmyadmin, то запрос выводит то, что нужно. А функция возвращает пустой массив:

function article_block($category){try {$dsn = sprintf('mysql:host=%s;dbname=%s;charset=utf8', HOST, DB);$pdo = new PDO($dsn, USER, PASS);$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);}catch (PDOException $e) {echo "<p>Запрос на выборку данных из бызы не прошёл. Напишите об этом администратору <a href='mailto:admin@torawhite.ru'>admin@torawhite.ru</a>.</p><br>ERROR: " . $e->getMessage();exit;}$sql = '(SELECT article_id, article_cat_id, article_par_id, article_title, article_img, article_author, article_author_card, article_description, article_date, article_views FROM articles WHERE article_cat_id = :cat)UNION(SELECT article_id, article_cat_id, article_par_id, article_title, article_img, article_author, article_author_card, article_description, article_date, article_views FROM articles WHERE article_cat_id IN(SELECT cat_id FROM magazine_left_sidebar WHERE parent_id = :cat))';$data = $pdo->prepare($sql);$data->bindValue (':cat', $category);$data->execute();$article_block = $data->fetchAll(PDO::FETCH_ASSOC);return $article_block;}

Не могу понять, в чём дело...

Так заработало, но некорректно - возвращает всегда один и тот же массив, независимо от значения параметра

$data->bindValue (':cat', $category);
Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Попробуйте без prepare. Если заработает, то делайте не через именованные параметры, а через неименованные (?).

Спасибо. Не знаю, правильно ли, но так тоже не работает:

$sql = 'SELECT article_id, article_cat_id, article_par_id, article_title, article_img, article_author, article_author_card, article_description, article_date, article_views FROM articles WHERE article_cat_id = ?UNIONSELECT article_id, article_cat_id, article_par_id, article_title, article_img, article_author, article_author_card, article_description, article_date, article_views FROM articles WHERE article_cat_id IN(SELECT cat_id FROM magazine_left_sidebar WHERE parent_id = ?) ORDER BY article_id DESC';$data = $pdo->prepare($sql);$data->execute(array($category, $category));$article_block = $data->fetchAll(PDO::FETCH_ASSOC);return $article_block;
Link to comment
Share on other sites

  • 0

Попробуйте без prepare. Если заработает, то делайте не через именованные параметры, а через неименованные (?).

Так функция работает (убрал получение параметра и вписал значение принудительно):

function article_block(){try {$dsn = sprintf('mysql:host=%s;dbname=%s;charset=utf8', HOST, DB);$pdo = new PDO($dsn, USER, PASS);$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);}catch (PDOException $e) {echo "<p>Запрос на выборку данных из бызы не прошёл. Напишите об этом администратору <a href='mailto:admin@torawhite.ru'>admin@torawhite.ru</a>.</p><br>ERROR: " . $e->getMessage();exit;}$sql = 'SELECT article_id, article_cat_id, article_par_id, article_title, article_img, article_author, article_author_card, article_description, article_date, article_views FROM articles WHERE article_cat_id = :catUNIONSELECT article_id, article_cat_id, article_par_id, article_title, article_img, article_author, article_author_card, article_description, article_date, article_views FROM articles WHERE article_cat_id IN(SELECT cat_id FROM magazine_left_sidebar WHERE parent_id = :cat) ORDER BY article_id DESC';$data = $pdo->prepare($sql);$data->bindValue(':cat', 1);$data->execute();$article_block = $data->fetchAll(PDO::FETCH_ASSOC);return $article_block;}

Так не работает:

function article_block($category){try {$dsn = sprintf('mysql:host=%s;dbname=%s;charset=utf8', HOST, DB);$pdo = new PDO($dsn, USER, PASS);$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);}catch (PDOException $e) {echo "<p>Запрос на выборку данных из бызы не прошёл. Напишите об этом администратору <a href='mailto:admin@torawhite.ru'>admin@torawhite.ru</a>.</p><br>ERROR: " . $e->getMessage();exit;}$sql = 'SELECT article_id, article_cat_id, article_par_id, article_title, article_img, article_author, article_author_card, article_description, article_date, article_views FROM articles WHERE article_cat_id = :catUNIONSELECT article_id, article_cat_id, article_par_id, article_title, article_img, article_author, article_author_card, article_description, article_date, article_views FROM articles WHERE article_cat_id IN(SELECT cat_id FROM magazine_left_sidebar WHERE parent_id = :cat) ORDER BY article_id DESC';$data = $pdo->prepare($sql);$data->bindValue(':cat', (int)$category, PDO::PARAM_INT);$data->execute();$article_block = $data->fetchAll(PDO::FETCH_ASSOC);return $article_block;}
Link to comment
Share on other sites

  • 0

Попробуйте без prepare. Если заработает, то делайте не через именованные параметры, а через неименованные (?).

Разобрался

$category = $_GET['category'];

Не думал, что так важно, как оказалось...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy