php functie bij bestaan of niet bestaan van tables
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:
Code (php)
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
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$result = mysql_query('select 1 from `table`');
if($result !== FALSE)
else
{
echo "table bestaat niet";
}
?>
$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
- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 23/06/2017 13:54:03 door - Ariën -
Ik zou als query SHOW TABLES LIKE 'table' uitvoeren en kijken of je in het resultaat de gewenste tabel terugkrijgt.
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.
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.
Als het goed is zal je foutmelding laten zien dat een tabel niet bestaat op het moment dat de query mislukt.
Michel Bak op 24/06/2017 15:04:41:
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.
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.
Gewijzigd op 24/06/2017 23:26:22 door Ozzie PHP
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.
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.
Gewijzigd op 25/06/2017 14:57:58 door Thomas van den Heuvel
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.
en of die van het juiste type zijn.
Deze controle hoort thuis in een installatie procedure.
Of controleer jij bij elke include ook of de betreffende file wel aanwezig is?
Ergens houdt de controle op en ga je er vanuit dat de scripts+database aanwezig zijn.
Userdata wel controleren uiteraard (is de geuploade file aanwezig etc)
Willem ik wil niet eigenwijs overkomen maar probeer het geheel gewoon te snappen, bedankt voor de informatie.
Allemaal bedankt voor de informatie erg fijn dat er zo gereageerd wordt. Ik ben nog maar net begonnen.
Echter zie ik dat ik het niet helemaal goed heb uitgelegd (excuses hiervoor) Het is nl een opdracht die ik moet maken en later als basis wil gebruiken voor meerdere formulieren op verschillende servers. In de opdracht wordt gevraagd dat wanneer de tabellen niet bestaan het formulier niet moet werken, wat is volgens jullie dan de beste oplossing? Moet ik het if else helemaal vergeten en een totaal andere aanpak gebruiken?
Nogmaals bedankt voor alle info!
Michel
Zonder begin je namelijk echt niets.
En is dat dan de enige tabel ? Of zijn er ook nog ergens tabellen waar afhankelijkheden in staan ? Een database met slechts één tabel kom je namelijk niet zo erg vaak tegen.
Een metafoor. Je bent van plan om een autorit te gaan maken. Om je er verzekerd van te zijn dat je onderweg niet stil komt te staan zorg je ervoor dat je een volle tank hebt voordat je op stap gaat. Dan hoef je onderweg ook niet continu op de brandstofmeter te kijken omdat je dit vantevoren al geregeld hebt.
Hetzelfde geldt voor je formulier: vast onderdeel van de installatie is het aanmaken van de tabellen. Vervolgens zou je er van uit moeten kunnen gaan dat zodra deze functionaliteit actief is, de tabellen ook beschikbaar zijn. Er is dan geen reden om hier nogmaals expliciet in code op te controleren.
En wat natuurlijk altijd een goed idee is is het testen of de functionaliteit werkt. Dus nadat je tabellen+formulier+whatever ergens hebt geïnstalleerd doorloop je deze eenmalig en controleer je of alles het doet.