Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP/MySQL] Probleem met MySQLi

Pagina: 1
Acties:

  • Josaus
  • Registratie: September 2010
  • Laatst online: 15-11 17:20
Beste tweakers,
Voor een website moet ik een menu uit een database generen. Hiervoor maak ik gebruik van deze code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function makeMenu() { // vormt een menu naar de (actieve) pagina's aangegeven in de pages tabel. taalafhankelijk. moet nog gebouwd worden
        $menu = '';
        $config = $this->config();
        $mysqli = new mysqli($config['mysql']['host'], $config['mysql']['user'], $config['mysql']['password'], $config['mysql']['db']);
        
        $query = "
        SELECT title_?, file
        FROM page
        WHERE active = 1
        ";
        if($maker = $mysqli->prepare($query)) {
            $maker->bind_param('s', $this->lang);
            $maker->execute();
            $maker->bind_result($titles, $paths);
            while($maker->fetch()) {
                $menu .= sprintf('<a href="./%1$s.php" title="%2$s">%2$s</a>\n', $paths, $titles);
            }
            $maker->close();
        }
        $mysqli->close();
        return $menu;
    }

$mysqli->prepare($query) geeft FALSE. Dit ligt hoogstwaarschijnlijk aan de $query want de inloggegevens kloppen want dit heeft bij een andere functie wel gewerkt. (hieronder)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function loadInfo($pid) {
        $config = $this->config();
        $mysqli = new mysqli($config['mysql']['host'], $config['mysql']['user'], $config['mysql']['password'], $config['mysql']['db']);
        
        $query = "
        SELECT id, title_?, content
        FROM page
        WHERE id = ?
        ";
        if($loader = $mysqli->prepare($query)) {
            $loader->bind_param('sd', $this->lang, $pid);
            $loader->execute();
            $loader->bind_result($id, $title, $content);
            $loader->fetch();
            $loader->close();
        }
        $mysqli->close();
        return $result;
    }

Ik heb het ook op een andere manier geprobeerd:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$langTit = 'title_' . $this->lang;
$query = "
        SELECT ?, file
        FROM page
        WHERE active = 1
        ";
        if($maker = $mysqli->prepare($query)) {
            $maker->bind_param('s', $langTit);
            $maker->execute();
            $maker->bind_result($titles, $paths);
            while($maker->fetch()) {
                $menu .= sprintf('<a href="./%1$s.php" title="%2$s">%2$s</a>\n', $paths, $titles);
            }
            $maker->close();
        }

Dit werkte ook niet, ik krijg hierbij wel de goeie path maar niet de goeie title. Als title kreeg ik namelijk 'title_nl'.
Ik heb niet echt veel ervaring met prepared statements, maar dit lijkt me gewoon raar. Hopelijk weet iemand hier iets op :D

Groeten, Kees

  • EnnaN
  • Registratie: September 2002
  • Laatst online: 10:44

EnnaN

Toys in the attic

Je probeert het verkeerde te preparen. Prepared statements zijn er om dezelfde query meerdere keren met andere parameters uit te voeren, maar jij wil steeds een andere query doen ;)

Van deze pagina: http://www.php.net/manual/en/mysqli.prepare.php
Note:

The markers are legal only in certain places in SQL statements. For example, they are allowed in the VALUES() list of an INSERT statement (to specify column values for a row), or in a comparison with a column in a WHERE clause to specify a comparison value.

However, they are not allowed for identifiers (such as table or column names)
(emph mine)

sig


  • Josaus
  • Registratie: September 2010
  • Laatst online: 15-11 17:20
EnnaN schreef op donderdag 25 oktober 2012 @ 21:08:
Je probeert het verkeerde te preparen. Prepared statements zijn er om dezelfde query meerdere keren met andere parameters uit te voeren, maar jij wil steeds een andere query doen ;)

Van deze pagina: http://www.php.net/manual/en/mysqli.prepare.php


[...]


(emph mine)
Het werd mij aangeraden om te gebruiken voor wachtwoorden bij loginscripts. Kan dat wel dan ? XD

Zou ik er dan dit van maken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function makeMenu() {
        $menu = '';
        $config = $this->config();
        $mysqli = new mysqli($config['mysql']['host'], $config['mysql']['user'], $config['mysql']['password'], $config['mysql']['db']);
        
        $sql = sprintf('
        SELECT title_%s, file
        FROM page
        WHERE active = 1',
        $this->lang);
        if($query = $mysqli->query($sql, MYSQLI_USE_RESULT)) {
            while($items = $query->fetch_row()) {
                $menu .= sprintf('<a href="./%1$s.php" title="%2$s">%2$s</a>\n', $items[1], $items[0]);
            }
            $query->close();
        }
        $mysqli->close();
        return $menu;
    }
(ik test hem nu, verander zo m'n post wel)

EDIT: hij lijkt nu te werken :D Bedankt voor de hulp Ennan!

[ Voor 3% gewijzigd door Josaus op 25-10-2012 21:26 ]


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Josaus schreef op donderdag 25 oktober 2012 @ 21:20:
Het werd mij aangeraden om te gebruiken voor wachtwoorden bij loginscripts. Kan dat wel dan ? XD
Tuurlijk, maar die ? in een query kan alleen bij parameters, niet bij zaken als kolomnamen. "SELECT title_? FROM title_list" kan dus niet, "SELECT title FROM title_list WHERE lang = ?" dus wel. Ik weet niet precies hoe je databasemodel eruit ziet maar het lijkt er een beetje op dat het niet helemaal in elkaar zit zoals het hoort. Dan krijg je dus dit soort issues.

Ik weet niet precies wat je aan title_ kolommen hebt maar ik vermoed dat je het verkeerd doet.

https://niels.nu


  • Josaus
  • Registratie: September 2010
  • Laatst online: 15-11 17:20
Hydra schreef op vrijdag 26 oktober 2012 @ 09:56:
[...]


Tuurlijk, maar die ? in een query kan alleen bij parameters, niet bij zaken als kolomnamen. "SELECT title_? FROM title_list" kan dus niet, "SELECT title FROM title_list WHERE lang = ?" dus wel. Ik weet niet precies hoe je databasemodel eruit ziet maar het lijkt er een beetje op dat het niet helemaal in elkaar zit zoals het hoort. Dan krijg je dus dit soort issues.

Ik weet niet precies wat je aan title_ kolommen hebt maar ik vermoed dat je het verkeerd doet.
Ja, in deze database heerst een gebrek aan normalisatie. Het is tweetalig dus vond het geen probleem om (tijdelijk) title_nl en title_en kolommen aan te maken.

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Josaus schreef op vrijdag 26 oktober 2012 @ 12:39:
[...]
Het is tweetalig dus vond het geen probleem om (tijdelijk) title_nl en title_en kolommen aan te maken.
Waarom vind je het dan wel een probleem om (tijdelijk) 2 losse query's te maken? :)

Dat is eigenlijk de vraag die je jezelf moet stellen.

  • Josaus
  • Registratie: September 2010
  • Laatst online: 15-11 17:20
Gomez12 schreef op vrijdag 26 oktober 2012 @ 12:56:
[...]

Waarom vind je het dan wel een probleem om (tijdelijk) 2 losse query's te maken? :)

Dat is eigenlijk de vraag die je jezelf moet stellen.
Hoeft niet met twee losse query's :p Naja alleen bij het invoegen.. Maar het komt wel goed met deze tabel :D
Nog iets leuks: dit script heb ik voor iemand gemaakt, blijkt dat de server geen MySQLi ondersteunt..

  • Cartman!
  • Registratie: April 2000
  • Niet online
Hoster aan z'n mouw trekken dat ie dat even installeert dan, is vrij standaard namelijk... vrees alleen dat als de hoster zelfs mysqli niet heeft dat ie een oude versie PHP draait die weer z'n eigen lekken heeft.
Pagina: 1