boeken brengen geen wijsheid!
IK ben bezig met een nieuwsberichten systeempje voor de website van de voetbalvereniging.
Ik vond in het boek "PHP 4 en 5 zonder stress" de uitleg over een systeem.
Nu staan er wel veel meer fouten in deze boeken, maar nu zit ik er wel mee.
Er wordt gebruik gemaakt van een create tabel zoals hier onder, maar phpmyadmin geeft hier een opmerking bij(maar maakt de tabel wle aan).
Wat is er fout aan de volgende code, deze komt rechtstreeks uit het boek:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
CREATE TABLE news(
news_ID int(11) NOT NULL auto_increment,
news_header varchar(120) Not Null,
news_main text NOT NULL,
news_datetime datetime DEFAULT '0000-00-00 00:00:00'NOT NULL,
PRIMARY KEY (news_ID),
KEY news_ID (news_ID),
UNIQUE news_ID_2 (news_ID)
);
news_ID int(11) NOT NULL auto_increment,
news_header varchar(120) Not Null,
news_main text NOT NULL,
news_datetime datetime DEFAULT '0000-00-00 00:00:00'NOT NULL,
PRIMARY KEY (news_ID),
KEY news_ID (news_ID),
UNIQUE news_ID_2 (news_ID)
);
Opmerking phpmyadmin:
PRIMARY en INDEX sleutels behoren niet beide ingesteld te zijn voor de kolom `news_ID`
Tip: Gebruik nooit een DEFAULT samen met een NOT NULL. Dat is tegenstrijdig, NOT NULL eist een waarde en DEFAULT eist geen waarde, stelt dan zelf een waarde in. Wat wil je nu? Verplicht wat eigenlijk niet verplicht is, dat werkt niet.
Een primary 'auto-increment' is per definitie toch een index en uniek?
Arjan Kapteijn schreef op 13.03.2008 12:57:
Wel een index, niet uniek:Een primary 'auto-increment' is per definitie toch een index en uniek?
Code (php)
1
2
3
4
5
6
2
3
4
5
6
CREATE TABLE test (
id int(11) NOT NULL,
auto int(11) NOT NULL auto_increment,
PRIMARY KEY (id),
KEY auto (auto)
) ENGINE=InnoDB;
id int(11) NOT NULL,
auto int(11) NOT NULL auto_increment,
PRIMARY KEY (id),
KEY auto (auto)
) ENGINE=InnoDB;
Je kunt nu gerust dubbele waardes invoeren in de kolom 'auto', dat is geen enkel probleem:
Code (php)
1
2
3
2
3
INSERT INTO test(id, auto) VALUES (1,4);
INSERT INTO test(id, auto) VALUES (2,4);
INSERT INTO test(id, auto) VALUES (3,4);
INSERT INTO test(id, auto) VALUES (2,4);
INSERT INTO test(id, auto) VALUES (3,4);
De auto_increment wordt zelfs niet gebruikt!
Edit: De auto_increment wordt overigens wel opgehoogd, ook al gebruik je hem niet... Het blijft een bijzonder ding, dat MySQL!
Gewijzigd op 01/01/1970 01:00:00 door Frank -
wat bedoel je daarmee? pgFrank!
dit is het resultaat als je dat doet.
SQL-query:
CREATE TABLE `gboek` (
`id` int( 3 ) NOT NULL AUTO_INCREMENT ,
`titel` varchar( 40 ) NOT NULL '',
`naam` varchar( 40 ) NOT NULL '',
`bericht` text NOT NULL '',
`datum` varchar( 20 ) NOT NULL '',
`ip` varchar( 20 ) NOT NULL '',
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;
MySQL retourneerde:
#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 ''',
`naam` varchar(40) NOT NULL '',
`bericht` text NOT NULL '',
`datum`' at line 3
En waarom wederom de blunder om een datum in een VARCHAR te zetten?
Tip: Duik eens in de handleiding, daar staat die ook allemaal in.
Of zou die van mij, ondanks de brakheid toch moeten werken?
Ik vraag het maar even, voordat ik zo het halve boek heb over getypt en het script werkt niet!
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
CREATE TABLE news
(
news_id int(11) NOT NULL auto_increment,
news_header varchar(120) NOT NULL,
news_main text NOT NULL,
news_datetime datetime NOT NULL,
PRIMARY KEY (news_ID)
);
(
news_id int(11) NOT NULL auto_increment,
news_header varchar(120) NOT NULL,
news_main text NOT NULL,
news_datetime datetime NOT NULL,
PRIMARY KEY (news_ID)
);
Dit is een prima query om je nieuws tabel aan te maken.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
CREATE TABLE news(
news_ID int NOT NULL auto_increment,
news_header varchar(120) Not Null,
news_main text NOT NULL,
news_datetime datetime DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (news_ID)
);
news_ID int NOT NULL auto_increment,
news_header varchar(120) Not Null,
news_main text NOT NULL,
news_datetime datetime DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (news_ID)
);
Edit: ;)
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Even mijn administratie afmaken van vandaag en ik ga er direkt mee aan het werk.
Ik ben een website aan het maken voor de voetbalvereniging en heb al veel dingen gebruikt die we hier behandeld hebben.
Zo heb ik het gastenboek gemaakt met de leerstof van mijn online reserveringsscript van een tijdje geleden!
zie www.rcz.nu
Gewijzigd op 01/01/1970 01:00:00 door Peter Arendse
Het blijft behelpen met MySQL...
Volgend het boek haal ik de nieuws records op de volgende manier uit de db en dat werkt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$mysql_id=mysql_connect($dbhost,$dbuser,$dbpass)
or die("kan geen verbinding maken met de de database: ".mysql_error());
mysql_select_db($db, $mysql_id);
$news_SQL = "SELECT
news_ID,
news_header,
news_main,
DATE_FORMAT(news_datetime , '%d %m %Y') AS datum_NL,
DATE_FORMAT(news_datetime , '%H:%i') AS tijd_NL
FROM
news
ORDER BY
news_datetime
DESC";
$news_result = mysql_query($news_SQL);
?>
<?php
while($news = mysql_fetch_array($news_result)){
if(strlen($news['news_main']) > 100){
$news['news_main'] = substr($news['news_main'], 0, 80) . ">>>
<a href=nieuws/news.php?news_ID=". $news['news_ID'] . "><b>lees verder</b></a>";
}
?>
$mysql_id=mysql_connect($dbhost,$dbuser,$dbpass)
or die("kan geen verbinding maken met de de database: ".mysql_error());
mysql_select_db($db, $mysql_id);
$news_SQL = "SELECT
news_ID,
news_header,
news_main,
DATE_FORMAT(news_datetime , '%d %m %Y') AS datum_NL,
DATE_FORMAT(news_datetime , '%H:%i') AS tijd_NL
FROM
news
ORDER BY
news_datetime
DESC";
$news_result = mysql_query($news_SQL);
?>
<?php
while($news = mysql_fetch_array($news_result)){
if(strlen($news['news_main']) > 100){
$news['news_main'] = substr($news['news_main'], 0, 80) . ">>>
<a href=nieuws/news.php?news_ID=". $news['news_ID'] . "><b>lees verder</b></a>";
}
?>
Als ik nu op de link "lees verder" klik, krijg ik de volgende fout:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /www/htdocs/rczy/nieuws/news.php on line 19
terwijl ik de volgende code toch echt teken voor teken uit het oek heb over getypt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$mysql_id=mysql_connect($dbhost,$dbuser,$dbpass)
or die("kan geen verbinding maken met de de database: ".mysql_error());
mysql_select_db($db, $mysql_id);
$news_SQL = "SELECT
news_ID,
news_header,
news_main,
DATE_FORMAT(news_datetime , '%d %m %Y') AS datum_NL,
DATE_FORMAT(news_datetime , '%H:%i') AS tijd_NL
FROM
news
WHERE
news_ID=$news_ID"
;
$news_result = mysql_query($news_SQL);
$news = mysql_fetch_array($news_result);
?>
$mysql_id=mysql_connect($dbhost,$dbuser,$dbpass)
or die("kan geen verbinding maken met de de database: ".mysql_error());
mysql_select_db($db, $mysql_id);
$news_SQL = "SELECT
news_ID,
news_header,
news_main,
DATE_FORMAT(news_datetime , '%d %m %Y') AS datum_NL,
DATE_FORMAT(news_datetime , '%H:%i') AS tijd_NL
FROM
news
WHERE
news_ID=$news_ID"
;
$news_result = mysql_query($news_SQL);
$news = mysql_fetch_array($news_result);
?>
Wat gaat er mis?
Als je van
dit
maakt dan krijg je de foutmelding waarom het niet lukt.
Maar hoe kom je $news_ID?
Ik gok je dat je $_GET['news_ID'] wilt gebruiken.
Dan moet je query zoiets worden.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
$news_SQL = "SELECT
news_ID,
news_header,
news_main,
DATE_FORMAT(news_datetime , '%d %m %Y') AS datum_NL,
DATE_FORMAT(news_datetime , '%H:%i') AS tijd_NL
FROM
news
WHERE
news_ID= '" . mysql_real_escape_string($_GET['news_ID']) . "'"
;
news_ID,
news_header,
news_main,
DATE_FORMAT(news_datetime , '%d %m %Y') AS datum_NL,
DATE_FORMAT(news_datetime , '%H:%i') AS tijd_NL
FROM
news
WHERE
news_ID= '" . mysql_real_escape_string($_GET['news_ID']) . "'"
;
De mysql_real_escape_string zorgt dat mensen niet met je query kunnen gaan kloten (er kunnen btw nog wel wat meer controles op).
Beetje raar dat dat niet in het boek staat trouwens...
Gewijzigd op 01/01/1970 01:00:00 door Henk PHP
Het is geen gastenboek.
IK heb je code uitgevoerd en het script geeft nu de volgende melding:
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 '' at line 10
Op lijn 10 staat bij mij:
news_main,
Try this:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
$news_ID = $_GET['news_ID'];
$news_SQL = "SELECT
news_ID,
news_header,
news_main,
DATE_FORMAT(news_datetime , '%d %m %Y') AS datum_NL,
DATE_FORMAT(news_datetime , '%H:%i') AS tijd_NL
FROM
news
WHERE
news_ID = '" . mysql_real_escape_string($news_ID) . "'"
;
$news_SQL = "SELECT
news_ID,
news_header,
news_main,
DATE_FORMAT(news_datetime , '%d %m %Y') AS datum_NL,
DATE_FORMAT(news_datetime , '%H:%i') AS tijd_NL
FROM
news
WHERE
news_ID = '" . mysql_real_escape_string($news_ID) . "'"
;
Gewijzigd op 01/01/1970 01:00:00 door Henk PHP
Echo de query eens, dan wordt het een stuk duidelijker. Ik vermoed trouwens dat $news_ID leeg is, kijk daar eerst eens naar.
IK vind het wel verschrikkelijk vervelend dat ik uit een boek met zoveel fouten moet proberen om de tecnieken onder de knie te krijgen.
Het is geschreven door Jochen Franke en heet php4 zonder stress, maar ik zit gvd te zweten achter mijn toetsenbord oomdat niets lukt!!!!
Op internet zijn ook genoeg tutorials en voorbeelden te vinden waar je je voordeel mee zou kunnen doen. Dus ga niet alleen af op de informatie in je boek, maar probeer dat ook te staven aan de hand van beschikbare voorbeelden.