Люди могут заказывать ссылки на моей платформе, и они хранятся в двух разных таблицах, например, wp_project и wp_articles. Причина этого в том, что когда люди размещают заказ на 1 ссылку, создается одна строка проекта и создается одна строка статьи.
Однако, если клиент заказывает 10 ссылок, будет одна запись проекта и десять статей статьи. Теперь это не очень относится к моей проблеме, но просто для того, чтобы объяснить, как работает система.
Существует два общих идентификатора для проектов и статей, и идентификатор, и название проекта хранятся как в inpu_project, так и в inpu_articles.
Теперь, если я хочу отобразить все ссылки из одного проекта, я построил функцию поиска, в которой я могу выбрать идентификатор проекта, щелкнуть поиск и указать, будет ли клиент заказывать 1 ссылку или 20 ссылок с таким количеством ссылок.
Проблема начинается, когда я хочу искать по названию проекта вместо ID, который не числовой, а просто слова (иногда с пробелами).
Это для предотвращения ошибки неопределенного индекса в моих журналах ошибок
$where_clouse='';
Это функция поиска по названию проекта:
if(isset($_GET['todo']) && $_GET['todo']=='search')
{
if($_GET['proid']!=0){
$where_clouse.=' AND P.`project_title`='.$_GET['proid'];
}
}
Это запрос к базе данных, чтобы извлечь ссылки из него:
$sql="SELECT P.`project_title`, P.`backlink` FROM `inpu_articles` AS P
WHERE P.`post_it_posted` = '1' ".$where_clouse." ORDER BY P.`project_title` ASC";
$backlinks=$wpdb->get_results($sql, ARRAY_A);
Это реальная функция поиска, которая запускает первый код, который я вставил:
<p>Select a project title and hit search!</p>
<form action="" method="get">
<input type="hidden" name="todo" id="todo" value="search" />
<select name="proid" id="proid">
<option value="0">All Projects</option>
<?php $projects=getTitles(); foreach($projects as $project){ ?>
<option value="<?php echo $project['title']; ?>" <?php if(isset($_GET['proid']) && $_GET['proid']==$project['title'] ) { echo 'selected="selected"'; } ?> ><?php echo $project['title'] ?>
</option>
<?php } ?>
</select>
<input class="submit_search" type="submit" id="search_button" value="Search"/>
</form>
И этот код извлекает названия проектов из таблицы проектов:
function getTitles($where=false)
{
global $wpdb;
$sql="SELECT `title`, `link` FROM `inpu_project` WHERE `link`='1' ORDER BY `title` ASC";
$result = $wpdb->get_results($sql, ARRAY_A);
return $result;
}
Все довольно просто и работает на 100% нормально, если я заменю нецифровый заголовок в коде для таблиц inpu_articles и inpu_project числовым идентификатором.
Затем код делает именно то, что делает, но когда я использую вместо него название проекта, он просто показывает ВСЕ ссылки, которые когда-либо заказывал каждый клиент, и в моей базе данных не появляется никаких ошибок. Как будто он не может найти совпадение или что-то, что довольно странно.
Так я что-то здесь упускаю? Разве невозможно сопоставить слова или я должен что-то изменить, используя слова вместо числовых значений?
И наконец, для чего это стоит, это код, который повторяет запрос:
<?php foreach ($backlinks as $backlink) {
$backlink_overview=$backlink['backlink'];
?>
<ul>
<li><?php echo $backlink_overview; ?></li>
</ul>
<?php } ?>
Заголовки отображаются в раскрывающемся меню формы / поиска, поэтому я удивлен, что он не может сопоставить заголовок проекта с заголовком, который хранится в таблице статей.
Моя интуиция говорит, что это где-то не так:
P.`project_title`='.$_GET['proid'];
Но он не выдает никаких синтаксических ошибок или каких-либо ошибок, он просто показывает все ссылки, которые хранятся в таблице inpu_article, полностью игнорируя мою функцию поиска.
Проблема в состоянии для where_clause
и where_clause
сам.
Для проверки ввода необходимо проверить, установлен ли параметр и не является ли он пустым. Затем для предложения where нужно поместить строку в кавычки. Измените эту часть кода, как показано ниже
if(isset($_GET['proid']) && !empty($_GET['proid'])){
$where_clouse.=" AND P.project_title='".$_GET['proid']."'";
}
Я думаю, что вы можете ошибаться в заявлении SQL. И вы можете распечатать строковый оператор sql на экране и скопировать его в Mysql для проверки. Я надеюсь, что вы можете найти свою ошибку.