Я пытаюсь выполнять операции CRUD с использованием ООП и AJAX, и у меня возникла специфическая проблема. switch case statements запускается автоматически. У меня есть main_class, который содержит весь код для CRUD. И поскольку я хочу показать список всех категорий на отдельной странице, я столкнулся с проблемой. Делается автоматический пустой ввод в базу данных в таблице категорий.
main_class.php
class Main_class
{
function __construct()
{
include("db_connect.php");
$this->db=new Db_Connect;
$this->conn=$this->db->connect();
$this->category_name=$_POST['cat_name'];
$this->image_name=$_POST['image'];
}
public function category_add()
{
$x=$this->conn->query('Insert into categories (name) values '."('$this->category_name')");
echo $x;
}
public function upload_image()
{
$this->image_name=$_FILES["image"]["name"];
$this->image_tmp=$_FILES["image"]["tmp_name"];
$this->image_upload=time()."_".$this->image_name;
move_uploaded_file($this->image_tmp,"product_images/".$this->image_upload);
$x=$this->conn->query('Insert into images (name) values '."('$this->image_upload')");
echo $x;
}
public function showData()
{
$this->result=$this->conn->query('select * from categories');
return $this->result;
}
public function oop()
{
$this->conn->query('Insert into categories (name) values '."('oop')");
}
}
$obj=new Main_class();
switch($_POST['submit'])
{
case isset($_POST['cat_name']):
$obj->category_add();
break;
case isset($_POST['img']): //File upload code with OOPS
$obj->upload_image();
break;
default:
$obj->oop();//just to check
}
category_add.php
<h1>Category Add</h1>
<form method = "POST">
<input type = "text" name = "cat_name" placeholder = "Add Category"><br><br>
<input type = "submit" name = "submit" value = "category_add" id = "sub">
</form>
<script>
$(document).ready(function(){
$('#sub').click(function(event){
event.preventDefault();
$.ajax({
method:"POST",
url:"main_class.php",
data:$('form').serialize() + "&submit=submit&par2=2&par3=232"
});
});
});
</script>
Теперь проблема начинает появляться, когда я добавляю еще одну страницу, на которой пытаюсь показать список всех категорий. Когда я запускаю эту страницу, я получаю много ошибок, и в базу данных добавляется category. Я понял, что это происходит, потому что корпус переключателя запускается автоматически, но я не могу понять, когда значения не установлены, как это возможно, чтобы корпус переключателя сработал. Более того, когда я пытаюсь добавить категорию и изображение одну за другой, все работает отлично. В этот момент никаких помех не происходит.
category_show_all.php
<?php
include('main_class.php');
$this->obj=new Main_class;
$this->result=$this->obj->showData();
while($this->row=$this->result->fetch_assoc())
{
$this->row['name'];
}
Да, потому что значение submit отличается, и я хочу отправить submit на main_class.php для использования того же самого в случае коммутатора.
Я до сих пор не понимаю, почему вы добавляете &submit=submit к данным. Кроме того, вы не используете switch/case по назначению. Вместо этого просто используйте if/else, так как это в основном то, что вы делаете.
Если я не отправлю submit, как еще мне выполнить желаемый код? Не могли бы вы предложить другой способ. Я был бы признателен, что.
Но вы находятся отправляете submit, поскольку у вас есть <input type = "submit" name = "submit" value = "category_add" id = "sub">. Это отправит: submit=category_add. Сейчас вы отправляете: cat_name=foo&submit=category_add&submit=submit&par2=2&par3=232
@MagnusEriksson, я пытаюсь проверить вставку изображений и категорий с помощью submit. Я хочу сказать, что если мы получим submit в качестве значения, управление сдвинется вниз, а затем, в зависимости от того, что нам подходит, будет запущена та же функция.
Не думаю, что вы понимаете, о чем я. Вы отправляете submit=category_add&submit=submit. Нет необходимости добавлять второй submit=submit, так как у вас уже естьsubmit=category_add.
На самом деле я понимаю вашу точку зрения, поскольку я использовал if/elseif, мне на самом деле не нужно значение submit. Спасибо, что указали на это, но я до сих пор не могу понять, почему корпус переключателя запускается автоматически.






Если $_POST['submit'] не установлен или установлен и == 0, ваш коммутатор будет пытаться сопоставить значение, эквивалентное false, и если $_POST['cat_name'] также не установлен, вызов isset вернет false, который затем будет соответствовать значению выражения переключателя . Таким образом, будет вызван код для добавления категории.
Чтобы обойти это, добавьте if (isset($_POST['submit']) && $_POST['submit'] == 1) вокруг оператора switch.
Спасибо что подметил это. Никогда об этом не думал. А как можно обойти эту проблему?
Смотрите мою правку. Вам просто нужно проверить, действительно ли установлен $_POST['submit'].
Я бы рекомендовал вместо этого использовать if/else. Это сделало бы код способ более понятным, поскольку это в основном то, что OP пытается сделать с switch/case.
Только что добавлен isset($_POST['submit']), но корпус переключателя все еще горит и добавляется пустая категория.
@ Don'tDownvoteMe - Не используйте для этого switch/case ...
@MagnusEriksson Хорошо, я буду использовать if/else, но я не понимаю, почему корпус switch запускается, когда значение даже не установлено?
Я забыл, что вам все равно нужно проверить, что $_POST['submit'] был 1, а также установлен. Смотрите мою новую правку.
@ Don'tDownvoteMe - Потому что вы неправильно используете переключатель / регистр. Прочтите руководство о том, как его следует использовать.
@MagnusEriksson, хотя это неортодоксально, нет ничего принципиально неправильного в том, как используется переключатель. См. Принятый ответ на вопрос, который был помечен как дубликат ..
На самом деле, я думаю, что OP просто хочет сравнить значение submit (после комментариев под исходным сообщением) и тот факт, что submit действительно содержит имя метода, который вызывает OP. Так что думаю должно быть: swich($_POST['submit']) { case 'category_add': ...; case 'upload_image': ...; .... }.
@MagnusEriksson не следил за этой цепочкой. Думаю, ты в сущности прав. Однако мой ответ по-прежнему подходит для исходного вопроса! :)
У вас есть кнопка с именем
submitв форме, но вы все еще добавляете&submit=submitк данным?