Категория и подкатегория не совпадают - PullRequest
0 голосов
/ 14 октября 2019

У меня проблемы с полями категорий и подкатегорий.

Вскоре я создал категорию следующим образом: Литература , и хочу создать выпадающее подменю, например: поэзия, роман, научная литература.

Я получаю все категории на сайте, но вообще не могу получить поле подкатегории.

Вот мой код:


     $category=htmlspecialchars($_REQUEST['category']);
if(isset($category)){
    $avt=mysql_query("select * from  category order by id asc");
    while($category_id=mysql_fetch_array($avt))
    {
        ?> 

        <li><a href="#"> <k style="font-size:11px;"> <? 
   echo $category_id['catname'];            
    } }
    ?>  </k> </a> 




     <?



     $subcategory=htmlspecialchars($_REQUEST['subcategory']);
if(isset($subcategory)){
    $sql = mysql_query("SELECT t1.*,t2.* FROM category as t1, subcategory as t2 WHERE t1.id=t2.'$_REQUEST[subcat_id]'");
while($data = mysql_fetch_array($sql))

    { ?>


    <ul style="z-index:101;">
   <li> <k>  <a href="index.php?do=cat&id=<? echo $data['id'];?>" style="border-bottom:1px solid #CECECE; position:relative; left:-40px; font-size:11px; ">&nbsp; <?php echo $data["subcat_name"]; ?> </a> </k></li> 

   <?  } }

    ?>

А вот и mysql:

категория

id
catname

подкатегория

id
subcat_id
subcat_name

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

Спасибо

1 Ответ

0 голосов
/ 15 октября 2019

Даже если вы новичок, я бы посоветовал вам, вероятно, переоборудовать это. Начните с подключения к базе данных. mysql_ функции устарели (не рекомендуется для использования) в последней версии PHP 5 и полностью удалены в PHP v7, поскольку они представляют угрозу безопасности и плохо реализуются большинством. Вместо этого используйте PDO или MySQLi. Я предпочитаю PDO , поэтому я продемонстрирую, что:

# Create the connection thusly, fill in your own credentials
$con = new \PDO("mysql:host=localhost;dbname=mydatabase", $username, $password);

Далее вы должны знать разницу между isset и empty. В вашем случае ваш isset выдаст предупреждение, если $_REQUEST['category'] не установлен. Когда вы создаете свою собственную переменную, она гарантированно будет установлена ​​при проверке, потому что вы только что создали ее вручную.

Это выдаст предупреждение, если $_REQUEST['category'] не установлено, потому что вы присваиваете его перед проверкой:

$category = htmlspecialchars($_REQUEST['category']);

Это НЕ БУДЕТ выдавать предупреждение, потому что вы проверяете, установлен ли $_REQUEST['category']. Если нет, присвойте $category значение false по умолчанию:

# I like to use a ternary when there are only two options, but you can use if/else
$category = (isset($_REQUEST['category']))? htmlspecialchars(trim($_REQUEST['category'])) : false;

# This part now checks if the value that you created is NOT EMPTY because you
# have just created it, so checking if it is set is illogical
if(!empty($category)):
    # Now we use our connection here to query.
    # Here we can use query() because we don't have any variables to add into the query,
    # so it's safe to use this short version
    $avt = $con->query("select * from  category order by id asc");
    # Same while loop, just use the PDO version of fetching the results
    while($category_id = $avt->fetch(\PDO::FETCH_ASSOC)): ?>

        <?php
        /**
         * I'm not sure why you are using a "k" tag, so just combine with "a" tag
         * also, though you can use <? as a php open, it's not recommended
         * lastly, you have the close tag for "a" outside the loop, that is bad syntax
         * since the open is inside the loop
         */
        ?>

        <li><a href="#" style="font-size: 11px;"><?php echo $category_id['catname'] ?></a></li>

    <?php endwhile ?>
<?php endif ?>

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

# It's also worth noting here you have set this variable, but you don't actually use it...?
# Secondly, you are checking for "subcategory" here, but in the code below you are injecting "subcat_id"...should they match??
$subcategory = (isset($_REQUEST['subcategory']))? htmlspecialchars(trim($_REQUEST['subcategory'])) : false;

if(!empty($subcategory)):
    # Here is where you need to make a detour with your script. What you are doing is unsafe.
    # You can not inject that value right into the sql. You need to "prepare", "bind value", and "execute" it
    $subcat_id = $_REQUEST['subcat_id'];
    # First prepare using ? as placeholders for the value you want to search for
    # The naming convention on the "subcat_id" column I assume is actually the
    # the parent category? If so, maybe it should be called "parent_id" or "category_id"??
    $sql = $con->prepare("SELECT t1.*, t2.* FROM category as t1, subcategory as t2 WHERE t1.id = ? AND t2.subcat_id = ?");
    # Now you want to execute for those two question marks (?)
    # There are a few ways to prepare and bind parameters, this way is easy
    # and you can visually see what we are trying to accomplish
    $sql->execute([$subcat_id, $subcat_id]) ?>

    <!-- you probably don't want to be looping this (or it's close tag) -->
    <ul style="z-index:101;">

    <?php
    # Same type of thing as your first block of code
    while($data = $sql->fetch(\PDO::FETCH_ASSOC)): ?>

        <li><a href="index.php?do=cat&id=<?php echo $data['id'] ?>" style="border-bottom:1px solid #CECECE; position:relative; left:-40px; font-size:11px; ">&nbsp;<?php echo $data["subcat_name"] ?> </a></li> 

    <?php endwhile ?>

    <!-- end list -->
    </ul>
<?php endif ?>

Окончательный вывод заключается в том, что вам нужно проделать определенную работу, прежде чем вы приступите к основной проблеме, которая, вероятно, относится к вашему оператору SQL и значению, которое вы запрашиваете. Я бы предложил почитать любую из упомянутых концепций, с которой вы не знакомы.

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