Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Ongelma PDO:n kanssa

Sivun loppuun

villev [14.11.2010 20:07:24]

#

Olen juuri opetellut käyttämään PDO:ta, ja nyt eteeni tuli outo ongelma. Yritin googlettaa, mutta ei auttanut.

Tässä hieman koodia:

<?php

try {
	$c = new PDO("mysql:host=localhost;dbname=cms;charset=utf-8", "root", "");
} catch(PDOException $e) {
	die("VIRHE: " . $e->getMessage());
}

$c->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

function get_categories(){
	$s = "SELECT id, name FROM categories WHERE deleted = 0";
	$q = $c->prepare($s);
	$q->execute();
	while($r = $q->fetch()){
		$categories[] = array("id" => $r["id"], "name" => $r["name"]);
	}
	return $categories;
}

function print_bottom_menu(){
	$file = substr($_SERVER["PHP_SELF"], 5);
	$categories = get_categories();
	if($file == "entry.php"){
		foreach($categories as $array){
			echo '<li><a href="entry.php?category=', $array['id'],'>', $array['name'],'</a></li>';
		}
	}
}

Ja tästä tulee virheilmoitus

Fatal error: Call to a member function prepare() on a non-object in c:\asd\asd\asd.php on line 13

Eli siis valittaa, että $c ei ole objekti, mutta en näe mitään syytä, miksei se olisi...?

tsuriga [14.11.2010 20:31:10]

#

$c ei näy funkkarin sisään, taikasana global.

-tossu- [14.11.2010 20:35:46]

#

villev kirjoitti:

Eli siis valittaa, että $c ei ole objekti, mutta en näe mitään syytä, miksei se olisi...?

Virhe tulee siitä, ettei muuttujaa $c ole määritelty. Funktion ulkopuolella määritellyt muuttujat eivät näy funktion sisällä, ellet määritä niitä globaaleiksi.

$a = "moi";
function foo () {
	global $a;
	echo $a;
}
foo ();

Tuossa tilanteessa muuttuja $c kannattaisi kuitenkin välittää funktiolle parametrinä.

function bar ($b) {
	echo $b;
}
bar ("moi");

villev [14.11.2010 20:44:01]

#

Äh, miksi en nyt tuota tajunnut >__>. Kiitos kuitenkin avusta!

tsuriga [14.11.2010 20:53:59]

#

-tossu- kirjoitti:

Funktion ulkopuolella määritellyt muuttujat eivät näy funktion sisällä, ellet määritä niitä globaaleiksi.

function foo () {
	global $a;

Sellainen stilistinen tarkennus, että avainsana global (manuaalia lainatakseni) määrittelee muuttujan globaaliksi funktion sisällä, ts. kutsut määriteltyihin muuttujiin viittaavat globaalin scopen vastaaviin muuttujiin. Globaalin scopen muuttujat löytyvät funkkarin käyttöön myös superglobaalista $GLOBALS-taulukosta ilman global-komentoa.

PS. Itsehän tykkäisin luoda tuossa tilanteessa luokan ja käyttää luokkamuuttujia.
PPS. Yleensä (ts. yleisimmissä konventioissa) funktionimen ja aloittavan sulun väliin ei jätetä tyhjää väliä. Just sayin'.

villev [17.11.2010 14:40:29]

#

Nyt tuli eteen taas uusi ongelma. En ymmärrä, mikä koodissa on vikana.

$data = array(1, 1, 112312312, 1, 'moi', 'Moi', 'Toimiiko?', 'Eipä taida');

$q = $c->prepare("INSERT INTO entries (category, subcategory, release, user, url, title, introduction, entry) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");

$q->execute($data);

Ja tämä tulostaa:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'release, user, url, title, introduction, entry) VALUES ('1', '1', '112312312', '' at line 1' in C:\asd\asd\asd.php:20
Stack trace:
#0 C:\asd\asd\asd.php(20): PDOStatement->execute(Array)
#1 {main}
thrown in C:\asd\asd\asd.php on line 20

Metabolix [17.11.2010 16:47:32]

#

Sana RELEASE on MySQL:ssä varattu (aivan kuten SELECT tai AND), joten jos sitä haluaa käyttää sarakkeen nimenä, se pitää kirjoittaa backtickeihin: `release`.

villev [18.11.2010 13:00:50]

#

Kiitokset avusta (taas kerran :))...


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta