Błąd przy aktualizacji pól

0

Witam,
Mam problem z aktualizacją artykułów. Zrobiłem dodawanie artykułu, wyświetlenie zawartości artykułu po ID i wyświetlanie w pliku edit.php.
Jednak gdy, chcę zaktualizować artykuł, to pojawia się monit Undevined vavriable i linijki wskazują na zmienne w formularzu.
O to kod pliku edit.php.

require_once('dbconn.php');

if(isset($_GET['id']) && is_numeric($_GET['id'])){
	
	if(isset($_POST['submit'])){
		$temat = $_POST['temat'];
		$tekst = $_POST['tekst'];
		$kategoria = $_POST['kategoria'];
	  if (empty($temat) || empty($tekst)){
	 echo '<div class="error">Pole jest puste!</div>';
      } else {
         echo '<div class="ok">Artykuł został pomyślnie zaktualizowany!</div>';

	
	$sql = "UPDATE artykuly SET temat='".$temat."', tekst ='".$tekst."', kategoria ='".$kategoria."'";
	if($query = $db->prepare($sql)){
	   $query->bind_param('sss', $temat, $tekst, $kategoria);
	   $query->execute();
	}else{
	 echo '<div class="error">Błąd w aktualizacji artykułu!</div>';
	 }
	
    }

   }else {
	   
	   if(is_numeric($_GET['id']) && $_GET['id'] > 0) {
	   
	    $id = $_GET['id'];
		
		$sql = "SELECT  temat, tekst, kategoria FROM artykuly WHERE id = ? ";
			 if($query = $db->prepare($sql)) {
				 $query->bind_param('i', $id);
				 $query->bind_result($temat, $tekst, $kategoria);
				 $query->execute();
				 $query->store_result();
                 $query->fetch();				 
			 }else {
				 
				 echo $db->error;
			 }
      
	  
      }
 
   }

}

	?>

formularz jest taki:

<a href="index.php" id="mlink">Strona główna</a> 
 <a href="#" id="mlink">Dodaj artykuł</a> 
 <a href="#" id="mlink">Pokaż kategorie</a> 
</div>
<form action="edit.php" method="post">
 <input type="text" class="pole" name="temat" value="<?php echo $temat; ?>"></input></div>
     <textarea  name="tekst" ><?php echo $tekst;?></textarea>
            <script type="text/javascript">
                CKEDITOR.replace( 'tekst' );
            </script>

<div id="margin">Kategoria: </div> 

	
	<select class="pole3" name="kategoria">
	
```php

<?php
require_once('dbconn.php');
$query = $db->query("SELECT * FROM kategorie");
while($row = $query->fetch_object()){
echo "<option value="&quot;.$row-">idkat."'>".$row->nazwakat."</option>";
}


```html
	</select>
	<input type="submit" class="btn" name="submit" value="Wyślij"></input>
	</form>

Co zrobiłem źle i jak powinno być?

dodanie znaczników <code class="html"> i <code class="php"> - @furious programming

0

Zdecyduj się, czy robisz szablon zapytania i bindujesz parametry, czy też wstawiasz je bezpośrednio. Pomijam fakt, że chcesz update'ować wszystkie rekordy w tablicy tymi samymi danymi.

0

No ja chce aktualizować rekordy z bazy danych z użyciem bind_param. Z tego wszystkiego , to w złym miejscu dałem formularz, powinien być za kodem php.

0

To spójrz w kod (przy update) i przemyśl raz jeszcze czy jest dobrze napisany.

0

kaczus, a jak powinno być? Możesz napisać?

0
  1. w formularzu bind_result PO execute
  2. fragment:
$sql = "UPDATE artykuly SET temat='".$temat."', tekst ='".$tekst."', kategoria ='".$kategoria."'";
    if($query = $db->prepare($sql)){
       $query->bind_param('sss', $temat, $tekst, $kategoria);
       $query->execute();
}

jest ZŁY - o czym piszę od kilku komentarzy! przypatrz się uważnie - w $sql masz kod z gotowymi danymi, więc bind_param (który jest dalej) wyleci w powietrze!

0

patrzę i patrzę i nic. Próbowałem usunąć to bind_param aż do execute i inaczej napisać, ale to już klapa. A mógłbyś napisać dlaczego i jak powinno być? Przeważnie piszę małe aplikacje bez edycji w php i nie codziennie. Wytłumacz jak możesz?

Pod sql w update próbowałem jeszcze tak napisać:

 
 $stmt = $db->prepare($sql);
 

    $stmt->bind_param(
        'sssi',
        $_POST['temat'],
        $_POST['tekst'],
        $_POST['id']
    );
 
  
    if($stmt->execute()){
        echo "artykuł został zaktualizowany";
 
        $stmt->close();
    }else{
        die("Błąd w aktualizacji!");
    }
}

I też lipa.

0

A skąd mam wiedzieć, skoro nie wiem jak wygląda zmienna $sql? Kryształową kulę mam w naprawie.

0

Postanowiłem inaczej zapytanie napisać, jakie widzę przeważnie w książkach i tutorialach na stronie. Będzie wersja druga bez zmiennych w zapytaniu, czyli tak jak wyżej napisałem i o to kod podaję:

if(isset($_POST['submit'])){
	
	$sql = "UPDATE artykuly SET temat = ?, tekst = ?, kategoria = ?  WHERE id = ? ";
	 $stmt = $db->prepare($sql);

    $stmt->bind_param(
        'ssii',
        $_POST['temat'],
        $_POST['tekst'],
        $_POST['kategoria'],
        $_POST['id']
    );
 
    if($stmt->execute()){
        echo "artykuł został zaktualizowany";
 
        $stmt->close();
    }else{
        die("Błąd w aktualizacji!");
       }
   }
}else 
// reszta bez zmian...

Tylko też tak nie działa. Ponieważ błędy wskazują na zmienne w formularzu, jako:Undefined variable. Mimo, że to co wyżej jest, to wzorowałem się na tym tutorialu:
https://www.codeofaninja.com/2011/12/php-and-mysql-crud-tutorial.html

0

Znowu bałagan w kodzie!
Tu masz 4 zmienne :

$sql = "UPDATE artykuly SET temat = ?, tekst = ?, kategoria = ?  WHERE id = ? ";

a tu deklarujesz, że podasz 4 argumenty (sssi), a podajesz 3:

 $stmt->bind_param(
        'sssi',
        $_POST['temat'],
        $_POST['tekst'],
        $_POST['id']
    );

Zacznij od uporządkowania wszystkiego - bo robisz bałaganiarsko i to jest podstawowy Twój problem.

0

No ja chcę edytować Temat, tekst i ma pojawiać się w rozwijanej liście kategoria to której przydzieliłem. Porządek jest temat s, tekst s, kategoria i, id też i.
Dobra, a co oznacza wg.ciebie uporządkowanie wszystkiego? Nawet Select jest zły?
Zrobię to inaczej, bo widzę że nie pomożesz. Napiszę z tego tutoriala, do którego link podałem napisać od zera z takim samym kodem. I zobaczę co i jak.

0

Uporządkowanie tego co robisz, bo większość błędów wynika z szybkich zmian kilku róznych kodów i sklejania tego (tak to wygląda). Nie jest to złe, ale taki bałagan trzeba najpierw uporządkować, bo inaczej właśnie - zapominasz o parametrze, mieszasz 2 sposoby tworzenia zapytań, kolejność wywołania metod itd. Czy nadal pojawia się błąd? Jeśli tak to jaki i w którym miejscu?

0

Mam kilka błędów:
Po naciśnięciu wyślij mam w polach kod html, później jak wyżej napisałem mam błąd typu Undefined Variable i wskazuje na zmienne w formularzu $temat i $tekst.
Wiem, że ten błąd dotyczy o niezdefiniowanej zmiennej.
Masz rację i Ci to przyznam, nie nauczę się gdy będę sklejać z gotowców, ale tyle kodów przed weekendem przepisałem (nie skopiowałem), i nic.
Tam gdzie mi się wyświetla artykuł, link do edycji mam w takiej postaci:

<a href="edit.php?id=<?php echo $id;?>">Edytuj wpis</a></div>

I zastanawiam się, że jest błąd w przesyłaniu Id, mimo że artykuł poprawnie edytuje się w polach. Tylko po naciśnięciu robi się wesołe miasteczko.

0

Problem jest taki, że id przekazujesz jako _GET, a w ostatniej wersji odbierasz jako _POST
W sumie, mozesz w formularzu umieścić kod:

<input type="hidden" id="id" name="id" value="<?php echo $id; ?>" />

i wtedy odbierzesz jako _POST, jeśli przekazujesz tak jak to teraz opisałeś, to powinieneś odbierać za pomocą _GET.
Tak jak napisałem zacznij od początku, najpierw bez aktualizacji - zamiast tego wypisz sobie na stronie co otrzymałeś, w jakiej formie itd. Jak już wszystko będzie dobrze, zajmij się dodaniem obsługi bazy. Bo błędów jak widzisz miałeś dużo i nie wszystkie jest się w stanie wyłapać, jesli kod jest tak posklejany. Jak się uczysz, to twórz najpierw kod prosty, a później go nadbudowuj pomału, ale dopiero, gdy ta część działa. Inaczej będziesz szukać błędów długo i jak poprawisz jedno - popsujesz drugie.

0

No ja właśnie tak robię, najpierw szablon strony, czyli html, css, w tym układ menu. Następnie w index dałem wyświetlanie wszystkich tematów. Mam dodawanie do bazy i tu bez problemu. Ale edycja kuleje. Dobra błędy z ze zmiennymi znikneły ale jest kolejny bład. Zniknął przycisk, nawet nie usunąłem i ciaglę jak przechodzę to edycji, to pisze że artykuł został zaktualizowany.
Tam gdzie jest if ($_POST) zmieniłem na $_GET.O to kod:

require_once('dbconn.php');


if($_GET){
 

    $sql = "UPDATE artykuly SET temat = ?, tekst = ? WHERE id= ?";
 
    $stmt = $db->prepare($sql);
 
    $stmt->bind_param('ssi',$_POST['temat'], $_POST['tekst'], $_POST['id']
    );
 
  
    if($stmt->execute()){
        echo "Arytkuł został zaktualziowany";
 

        $stmt->close();
    }else{
        die("Error");
    }
	
	$sql = "SELECT id, temat, tekst FROM artykuly WHERE
            id = \"" . $db->real_escape_string($_GET['id']) . "\"
        LIMIT 0,1";
           
      

$result = $db->query( $sql );
 

$row = $result->fetch_assoc();
 

extract($row);
 

$result->free();
$db->close();
	
}

A tu formularz

<form action='edit.php' method="post">
 <input type="text" class="pole" name="temat" value='<?php echo $temat; ?>'></input></div>
     <textarea  name="tekst"  value='<?php echo $tekst;?>'><?php echo $tekst;?></textarea>
            <script type="text/javascript">
                CKEDITOR.replace( 'tekst' );
            </script>

<div id="margin">Kategoria: </div> 

	
	<select class="pole3" name="kategoria">
	<?php
	require_once('dbconn.php');
	$query = $db->query("SELECT * FROM  kategorie");
		   while($row = $query->fetch_object()){
		     echo "<option value='".$row->idkat."'>".$row->nazwakat."</option>";
		   }
	?>
	 
	</select>
	<input type="submit" class="btn" name="submit" value="Wyślij"></input>
	</form>
0

Nie bardzo rozumiem co za efekt chcesz uzyskac tym fragmentem:

if($_GET)

oraz nie za bardzo czaję co teraz nie działa.

0

Nie działa poprawna aktualizacja, gdy wejdę w edycje to rekord aktualizuje się na czyste pole. I znikł przycisk wyślij.
Dobra, muszę wrócić do mojej zasady. Jeżeli nad czymś siedzę i jest zero efektu, trzeba od zera napisać. Postanowiłem na podstawie tego tutoriala do którego dałem link napisać tak jak tam jest, ale troszkę zmodyfikuję. A w między czasie pomyślę nad innym rozwiązaniem dotyczącym edycji. Choć tworząc mini cms, tam robiłem inną edycję bez bind param i działa.

Temat wg.mnie może być zamknięty. Nie ma sensu powtarzać się.

0

Znowu masz bałagan. Formatuj sobie kod, bedziesz widział.
już tu na początku:

<form action='edit.php' method="post">
 <input type="text" class="pole" name="temat" value='<?php echo $temat; ?>'></input></div>

od razu widać, że masz jakiś

</div>

dodatkjowo pierwszy raz się spotykam z konstrukcją:

<input type="text" class="pole" name="temat" value='<?php echo $temat; ?>'></input>

powinno być to chyba

<input type="text" class="pole" name="temat" value='<?php echo $temat; ?>' />

użyj formatowania w stylu jak w innych językach, unikniesz takich błędów.

<div>
    <inny blok>
       i tak dalej
    </inny blok>
</div>

wtedy takie błedy jak tutaj wyłapiesz.

0

kaczus, te pola w formularzu to już dawno poprawiłem zanim ty o tym tu napisałeś:) Już z edycją sobie poradziłem. Zrobiłem tak jak napisałem wcześniej. Teraz inne opcję napiszę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1