php functie bij bestaan of niet bestaan van tables
Door
Michel Bak
op 23-06-2017 09:08
gewijzigd op 23-06-2017 13:54
2.417 views
Hallo,
Ik ben bezig met een formulier schrijven die wanneer deze is ingevuld een mailtje stuurt naar 2 verschillende adressen. Dit lukt echter zit ik met een probleem:
Ik krijg het niet voor elkaar om ervoor te zorgen dat het formulier niet ingevuld kan worden wanneer de tables in de database nog niet bestaan. Ik heb veel gezocht en verschillende manieren geprobeerd waaronder de volgende:
<?php
$sql = "SELECT * FROM table ORDER BY datum ASC" && "SELECT * FROM table ORDER BY datum ASC";
$result = mysqli_query($connect, $sql);
if (mysqli_num_rows($result) < 1){
echo "De tabellen voor het invoeren van de gegevens zijn nog niet aangemaakt. Probeer het later nog eens.";
}else{
?>
Hierbij krijg ik de volgende melding (maakt niet uit of de tables wel of niet bestaan):
Error: Oeps er is iets fout gegaan op deze pagina! Probeer later nog eens aan te melden, of klik hier om terug te keren en opnieuw te proberen.Error type: 2: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given
Ook heb ik de volgende manier geprobeerd
<?php
$result = mysql_query('select 1 from `table`');
if($result !== FALSE)
else
{
echo "table bestaat niet";
}
?>
Ook deze krijg ik niet werkend, evenals andere constructies. Hoe los ik dit op?
Alvast bedankt :)
PS: er zijn 2 tables die ik gebruik voor dit formulier
Vanwaar die controle of de tabellen bestaan? Zijn er momenten dat je verwacht dat deze niet zullen bestaan?
Normaal zou je met foutafhandeling al een 'Table 'database.tabelnaam' doesn't exist' moeten krijgen dan.
En als je wilt controleren of de tabellen bestaan, moet je inderdaad Willem vp's methode proberen.
Ik wil een volledig formulier zodat wanneer iemand anders het nodig heeft, er aan wordt herinnerd om de tables aan te maken. (gebruik op meerdere servers)
Verder snap ik het gedeelte niet van show tables, ik wil de tables niet zien. Ik wil alleen controleren of ze aangemaakt zijn, zijn ze niet aangemaakt moet er een melding komen dat de tables niet zijn aangemaakt, zijn ze wel aangemaakt moet het formulier verschijnen.
Verder snap ik het gedeelte niet van show tables, ik wil de tables niet zien. Ik wil alleen controleren of ze aangemaakt zijn
Het is maar goed dat we hier niet in het leger zitten, want daar weten ze wel raad met eigenwijze personen... :-/
Wat is de gemakkelijkste manier om te testen of een tabel bestaat? Juist, je vraagt een overzicht van tabellen op en kijkt vervolgens of de gewenste tabel ertussen staat. Vind ik een stuk netter dan een willekeurige query af te vuren op de database en vervolgens óf te kijken of er een foutmelding terugkomt, óf niets te toen met de teruggekomen data.
>> Vind ik een stuk netter dan een willekeurige query af te vuren op ...
Hangt van de situatie af. Als de normale situatie is dat de tabel zou moeten bestaan, dan is het zonde van je resources (en hoogst ongebruikelijk) om voorafgaand aan ieder request te gaan controleren of de tabel wel bestaat. Het controleren of een tabel bestaat zou mijns inziens enkel een onderdeel kunnen zijn van een of andere initialisatieprocedure.
De situatie die ik hier beschreef (en waar het in de OP om gaat, getuige de 'select 1 from table') is dat je een bogus-select doet, alleen maar om te controleren of de tabel bestaat. Bestaat de tabel, dan doe je vervolgens niets met de geselecteerde data. Dat vind ik databasemisbruik.
TL;DR bij het uitvoeren van queries zou je moeten kijken of deze goed zijn verlopen en anders zou je foutmeldingen moeten produceren. Alle fouten zitten hier dan in principe al in inbegrepen zodat je geen onnodig programmeerwerk hoeft te verrichten voor het controleren van (alle) specifieke dingen die mis (zouden) kunnen gaan.
Michel Bak op 24/06/2017 15:04:41
Ik wil een volledig formulier zodat wanneer iemand anders het nodig heeft, er aan wordt herinnerd om de tables aan te maken. (gebruik op meerdere servers)
Dit lijkt mij de verkeerde insteek. Zo zou je alles wel in twijfel kunnen trekken (en overal -herhaaldelijk- op kunnen controleren) tijdens de uitvoer van een script. Zorg er gewoon voor dat op het moment dat deze formulierfunctionaliteit beschikbaar is, de tabellen ook daadwerkelijk bestaan zodat je hier aannames over kunt doen. Plan voor een situatie waarin iets werkt, niet voor alle situaties waarin iets mogelijk niet werkt.
Je zou hier dus geen specifieke controles moeten doen maar dingen gewoon zijn beloop laten gaan (loopt een query mis, laat deze lekker mislopen). Wanneer de tabel niet zou bestaan zou de query ook een fout moeten produceren. Als je zorgt dat je ergens foutafhandeling hebt of op zijn minst dingen logt dan zou vrij snel opgemerkt moeten worden dat er iets mis is. Wat de precieze verschijningsvorm van een fout is is niet echt relevant want het is aan een programmeur om aan de hand van logs of errormails of wat dan ook uit te zoeken wat er aan de hand is en eventueel om vast te stellen wie er steken heeft laten vallen. Het niet aanmaken van een tabel lijkt mij tot op zekere hoogte het niet volgen van een zeker protocol...
Ik zou inzetten op een werkende situatie in plaats van allerlei zeer specifieke controles van scenario's doen waarin de applicatie (mogelijk) niet werkt. Een bijkomend probleem van die aanpak is dat, omdat die scenario's zo specifiek zijn, je deze eigenlijk allemaal zou moeten definiëren om je ervan te vergewissen dat de applicatie (misschien) werkt. Het is dan ook heel makkelijk om een situatie die je niet hebt voorzien over het hoofd te zien.
Het is vele malen simpeler om stelregels te hebben waaraan iets moet voldoen in tegenstelling tot het definiëren van ALLE stelregels die niet van toepassing mogen zijn (vergelijk: whitelist vs blacklist).
En als een applicatie staakt wanneer een query niet werkt (bijvoorbeeld omdat een tabel niet bestaat) dan hoef je hier ook geen speciale kunstgrepen voor te programmeren. Laat de applicatie gewoon onderuit gaan (zij het enigszins stijlvol naar bezoekers toe) als er iets misgaat.
Om het iets korter/simpeler te verwoorden. Wat jij (Michel) doet of lijkt te doen, is voorafgaand aan iedere autorit snel even de motorklep open te doen en handmatig te gaan peilen of er nog wel genoeg olie in de motor zit, terwijl als dat niet het geval zou zijn er vanzelf een waarschuwingslampje gaat branden.
Daarmee wil ik niet zeggen dat je nooit je oliepeil moet (laten) controleren, maar dat doe je niet bij iedere autorit. Net zomin als dat je bij iedere query gaat controleren of de tabel wel bestaat. En net zomin als dat je van ieder bestand waarvan je weet dat het zou moeten bestaan, je eerst gaat controleren of het wel echt bestaat.