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...?
$c ei näy funkkarin sisään, taikasana global
.
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");
Äh, miksi en nyt tuota tajunnut >__>. Kiitos kuitenkin avusta!
-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'.
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
Sana RELEASE on MySQL:ssä varattu (aivan kuten SELECT tai AND), joten jos sitä haluaa käyttää sarakkeen nimenä, se pitää kirjoittaa backtickeihin: `release`.
Kiitokset avusta (taas kerran :))...
Aihe on jo aika vanha, joten et voi enää vastata siihen.