Даже если вы новичок, я бы посоветовал вам, вероятно, переоборудовать это. Начните с подключения к базе данных. 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; "> <?php echo $data["subcat_name"] ?> </a></li>
<?php endwhile ?>
<!-- end list -->
</ul>
<?php endif ?>
Окончательный вывод заключается в том, что вам нужно проделать определенную работу, прежде чем вы приступите к основной проблеме, которая, вероятно, относится к вашему оператору SQL и значению, которое вы запрашиваете. Я бы предложил почитать любую из упомянутых концепций, с которой вы не знакомы.