Przekazanie $_GET do metody($_GET zwraca true).

0

Cześć,
robię sobie system newsów wykorzystując a przynajmniej próbuję - programowanie obiektowe. Mam jednak problem, bo podczas edycji danych edytuje mi się zawsze news o id=1.
Prezentuję fragmenty kodu:
W ten sposób pobieram id newsa do inku - tu działa wszystko ok

echo '<p style="text-align: right; font-size: 14px; margin-right: 10px" class="italic">(<a href="news/edit_news.php?article='.$singleRecord['id'].'">Edit this artice</a>)</p>';
if(isset($_POST['submitEditedNews'])){
var_dump($_GET['article']);
$dbObject = new SqlDatabase();
$news = new News($dbObject->getInstance());
$rowRecords = $news->getNews();
if($_GET['article'] == NULL){
	header('Location: ../index.php');
}
//przekierowanie - zabezpieczenie przez wejściem na podstronę bez parametu `id`
	if ($rowRecords) {
		foreach($rowRecords as $singleRecord){
		$_GET['article'] = $singleRecord['id'];
		var_dump($_GET['article']); // zwraca poprawnie id newsa
		var_dump($singleRecord['id']);
	}
}
					
$news->setSubject($_POST['topic']);
$news->setContent($_POST['news']);
if ($news->validate()) {
    if ($news->doUpdateArticle()) {
        echo 'Edited news!';
        var_dump($_GET['article']);
    } else {
        echo 'Error to add';
    }
	} else {
	    echo sprintf('%s', $news->getErrors());
	}
	//var_dump($news);
}
public function doUpdateArticle(){
			$author = $_SESSION['nickname'];
			$date_article = date('Y-m-d H:i:s');
			$ip = $_SERVER['REMOTE_ADDR'];
			$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
			$aID = $_GET['article'];
			$editNews = $this->dbHandler->prepare("UPDATE `article` SET `author`=:author, `subject`=:topic, `content`=:news, `date_article`=:date_article, `ip` = :ip, `host` = :host WHERE `id` = :id");
			//var_dump($_GET['article']);
			$editNews->bindValue(":id", $aID, PDO::PARAM_INT);
			$editNews->bindValue(":author", $author, PDO::PARAM_STR);
			$editNews->bindValue(":topic", $this->subject, PDO::PARAM_STR);
			$editNews->bindValue(":news", $this->content, PDO::PARAM_STR);
			$editNews->bindValue(":date_article", $date_article, PDO::PARAM_INT);
			$editNews->bindValue(":ip", $ip, PDO::PARAM_STR);
			$editNews->bindValue(":host", $host, PDO::PARAM_STR);
			//$addNews->bindValue(":headImage", $content, PDO::PARAM_STR);
			if($editNews->execute() == false){	
				print_r($editNews->errorInfo());
				return false;		
				}else{	
				return true;
			}
		}

I tu pytanie. Czemu przed wykonaniem zapytania poprawnie pobierane jest id do get natomiast po wykonaniu zaptania przyjmuje ona wartość 1(true) - tak wynika z var_dump). Powoduje to, że zawsze zostaje nadpisany news o id=1. Co zrobić, żeby to naprawić? Jak poprawnie przekazać $_GET d metody aktualizującej dane?

0

Na pierwszy rzut oka to coś mi śmierdzi z $_GET['article'] = $singleRecord['id'];. Absolutnie nie powinieneś sobie o tak traktować zmiennej globalnej jako zwykłej tablicy. Zrób var_dump swojego $_GET['article'] za tym foreachem, w którym już zauważyłeś, że masz poprawne ID.** Musisz po prostu var_dumpować linijka po linijcie i patrzeć w którym momencie ginie Ci to id.**

0

Tak też robiłem. Dodam, że plik z metodą jest w osobnym pliku.
Problemem jest to, że id ginie w momencie wykonania metody:
doUpdateArticle
Może jakiś jeszcze pomysł?

0

Poza foreachem zwraca id pierwszego newsa. Tak wygląda zwracanie w var_dump():
article.png
Myślę, że problem jest w tej konstrukcji:

if ($rowRecords) {
	foreach($rowRecords as $singleRecord){
	$_GET['article'] = $singleRecord['id'];
	}
var_dump($_GET['article']);
}

gdyż zgodnie z tym co na obrazku, pętla leci do końca i wybiera ostatnie id(ostatni, bo w zapytaniu jest DESC)
Jak zatem pobrać JEDEN rekord ten pierwszy? I nie chodzi tu o LIMIT 1. Kolejnym problemem jest to, dlaczego $_GET['article']; nie działa w innym pliku? Gdy doochodzi do wykonania metody z zapytaniem aktualizującym , przypisuje mu ostatnie id i wyświetla komunikat "Edit news", co jest jakby logiczne. Nie jest globalne. Czemu się tak dzieje?

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