PHP-formulier voor het toevoegen van gegevens aan de database. PHP-invoer in MySQL-database. Praktische voorbeelden. Ongeldig gegevenstype

Deze handleiding laat u zien hoe u een database kunt beheren vanuit uw PHP script. Jij gaat studeren een record toevoegen aan een MySQL-tabel, gebruiken PHP-code. Bekijk voordat u begint onze andere tutorials waarin de basisstappen van het werken met PHP en databases worden behandeld: verbinding maken vanuit PHP met een MySQL-database.

Controleer het volgende voordat u begint:

  • Toegang tot uw hostingcontrolepaneel

Stap 1 - Een tabel maken

Allereerst moeten we een tabel voor uw gegevens maken. Dit is een heel eenvoudige procedure die u kunt uitvoeren phpMijnAdmin vanuit uw hostingcontrolepaneel. We hebben het proces van het maken van een MySQL-database al besproken in een eerdere zelfstudie, dus dat gedeelte slaan we hier over.

Nadat u bent ingelogd op de phpMyAdmin-pagina, ziet u een afbeelding als deze:

Laten we een tabel maken met de naam Studenten voor onze databank u266072517_naam. Via de knop kunt u een nieuwe tabel aanmaken Tabel maken. Hierna ziet u een nieuwe pagina waar u alle benodigde gegevens voor uw tabel kunt invoeren:

Dit is de eenvoudigste manier om een ​​tabel te maken. Voor meer informatie over de tabel-/databasestructuur en welke instellingen voor elk veld kunnen worden gebruikt, raadpleegt u de officiële phpMyAdmin-documentatie.

Hier volgen enkele eenvoudige uitleg van de velden die we zullen gebruiken:

  • Naam is de naam van uw veld. Verschijnt helemaal bovenaan uw tabel.
  • Type– hier kunt u het veldtype instellen. Wij kiezen bijvoorbeeld Varchar omdat we hier een string met een naam moeten invoeren (die letters bevat, geen cijfers).
  • Lengte/waarden– wordt gebruikt om de maximale lengte van uw invoer in dit veld in te stellen.
  • Index– we gebruiken de index “Primair” voor ons veld “ID”. Bij het maken van een tabel wordt aanbevolen om één ID-veld te hebben. Het wordt gebruikt om records in een tabel te indexeren wanneer relaties tussen tabellen zijn geconfigureerd. Hier kan het ook opgemerkt worden "A_I", wat betekent Automatische verhoging. Deze instelling verhoogt automatisch de index (1,2,3,4...).

Klik Redden en uw tabel wordt gemaakt.

Stap 2 - Maak PHP-code en voeg een item toe aan de MySQL-tabel

Optie 1 – MySQLi-methode

Allereerst moet u een verbinding met de database tot stand brengen, volgens onze vorige tutorial. Hierna kunnen we doorgaan met de SQL-query om een ​​record aan de MySQL-tabel toe te voegen − INVOEGEN. Hier is een compleet codevoorbeeld met verbindings- en invoegmethode:

" . mysqli_error($conn); ) mysqli_close($conn); ?>

Dus het eerste deel van de code (lines 3 – 18 ) verwijzen naar het onderdeel voor het tot stand brengen van de databaseverbinding. We zullen dit deel niet nog een keer doornemen. Als je wilt weten wat elke regel betekent, raadpleeg dan onze vorige handleiding over hoe je verbinding maakt met een database.

Laten we beginnen met de lijn 19 :

$sql = "INSERT INTO Students (naam, achternaam, e-mailadres) VALUES ("Thom", "Vial", " [e-mailadres beveiligd]")";

Dit is de belangrijkste coderegel en doet alles wat we in deze tutorial behandelen: een record toevoegen aan een MySQL-tabel in de database. INVOEREN is een expressie die een record toevoegt aan de opgegeven MySQL-databasetabel. In ons voorbeeld voegen we gegevens toe aan een tabel Studenten.

Verderop definiëren we tussen haakjes de tabelvelden waaraan we waarden zullen toevoegen: (naam, achternaam, e-mailadres). De gegevens worden in een specifieke volgorde toegevoegd. Als we schrijven (e-mailadres, achternaam, naam), worden de waarden in een andere volgorde toegevoegd.

Volgende deel van de betekenis WAARDEN. Hier stellen we onze waarden in de eerder opgegeven velden in. Elk veld krijgt dus zijn eigen waarde. In ons geval zou het bijvoorbeeld zoiets zijn als: naam = Thom, achternaam = Flacon, e-mail = [e-mailadres beveiligd] .

Wat belangrijk is om op te merken is dat we ons hier aan het vormen zijn SQL-query met behulp van PHP-code. SQL-query's moeten tussen aanhalingstekens staan. In ons voorbeeld is alles tussen de aanhalingstekens en na $sql = een SQL-query.

Het volgende deel van de code ( 20 – 22 lines) voert ons verzoek uit en controleert het succes van het verzoek:

If (mysqli_query($conn, $sql)) ( echo "Nieuw record succesvol aangemaakt"; )

Er wordt een succesbericht weergegeven als de query correct is uitgevoerd.

En het laatste deel ( 22 – 24 regels) tonen een ander bericht voor het geval ons verzoek mislukt:

Anders ( echo "Fout: " . $sql . "
". mysqli_error($conn); )

Deze code toont ons een foutmelding voor het geval er iets mis is gegaan.

Optie 2 – PHP Data Object-methode (P HP D ata O bject)

Net als in het vorige voorbeeld moeten we eerst een verbinding maken met de database, wat gebeurt bij het maken van een nieuw PDO-object - in de vorige tutorial wordt uitgelegd hoe dit gebeurt. Omdat een MySQL-databaseverbinding een PDO-object is, moeten we verschillende PDO-'methoden' (een soort functies die deel uitmaken van een specifiek object) gebruiken om de query voor te bereiden en uit te voeren. Objectmethoden worden als volgt genoemd:

$het_Object->de_Methode();

Met PDO kunt u SQL-code 'voorbereiden' voordat u deze uitvoert. De SQL-query wordt geëvalueerd en aangepast voordat deze wordt uitgevoerd. Zo kan een eenvoudige SQL-injectieaanval worden uitgevoerd door SQL-code in een formulierveld in te vullen. Bijvoorbeeld:

// De gebruiker schrijft dit in het gebruikersnaamveld van een inlogformulier thom"; DROP DATABASE user_table; // De laatste zoekopdracht wordt deze "SELECT * FROM user_table WHERE gebruikersnaam = thom"; DROP DATABASE user_table;

Omdat de SQL-code syntactisch correct is, wordt de puntkomma gemaakt DROP DATABASE user_table nieuwe SQL-query en uw gebruikerstabel wordt verwijderd. Voorbereide expressies staan ​​geen tekens toe En ; om het oorspronkelijke verzoek en de instructie te voltooien DATABANK DROP zal nooit worden geëxecuteerd.

Altijd Gebruik voorbereide queries bij het verzenden of ontvangen van gegevens uit een database met PDO.

Om voorbereide expressies te gebruiken, moet u een nieuwe variabele maken die de methode aanroept voorbereiden() op het databaseobject.

In de juiste vorm ziet de code er als volgt uit:

$servernaam = "mysql.hostinger.com"; $database = "u266072517_naam"; $gebruikersnaam = "u266072517_user"; $wachtwoord = "koopstuffpwd"; $sql = "mysql:host=$servernaam;dbnaam=$database;"; $dsn_Options = ; // Maak een nieuwe verbinding met de MySQL-database met behulp van PDO, $my_Db_Connection is een object try ( $my_Db_Connection = new PDO($sql, $username, $password, $dsn_Options); echo "Succesvol verbonden"; ) catch (PDOException $ error) ( echo "Verbindingsfout: " . $error->getMessage(); ) // Stel de variabelen in voor de persoon die we aan de database willen toevoegen $first_Name = "Thom"; $last_Name = "Flacon"; $e-mail = " [e-mailadres beveiligd]"; // Hier maken we een variabele die de methode prepare() van het databaseobject aanroept // De SQL-query die u wilt uitvoeren wordt ingevoerd als de parameter, en tijdelijke aanduidingen worden als volgt geschreven: placeholder_name $my_Insert_Statement = $my_Db_Connection-> prepare("INSERT INTO Students (naam, achternaam, e-mail) VALUES (:first_name, :last_name, :email)" // Nu vertellen we het script naar welke variabele elke tijdelijke aanduiding feitelijk verwijst met behulp van de bindParam() methode // First parameter is de tijdelijke aanduiding in de bovenstaande instructie - de tweede parameter is een variabele waarnaar moet worden verwezen $my_Insert_Statement->bindParam(:first_name, $first_Name $my_Insert_Statement->bindParam(:last_name, $last_Name); , $email); // Voer de query uit met behulp van de gegevens die we zojuist hebben gedefinieerd // De methode execute() retourneert TRUE als deze succesvol is en FALSE als dit niet het geval is, zodat u hier uw eigen berichten kunt schrijven als ( $my_Insert_Statement-> execute()) ( echo "Nieuw record succesvol aangemaakt"; ) else ( echo "Kan record niet aanmaken"; ) // Op dit punt kunt u de gegevens van de variabelen wijzigen en opnieuw uitvoeren om meer gegevens aan de database toe te voegen $first_Name = "John"; $last_Name = "Smid"; $e-mail = " [e-mailadres beveiligd]"; $my_Insert_Statement->execute(); // Voer opnieuw uit nu de variabelen zijn gewijzigd if ($my_Insert_Statement->execute()) ( echo "Nieuw record succesvol aangemaakt"; ) else ( echo "Kan record niet aanmaken"; )

Op de regels 28, 29 en 30 gebruiken we de methode bindParam() database-object. Er is ook een methode bindWaarde(), anders dan de vorige.

  • bindParam() – deze methode telt de gegevens wanneer de methode uitvoeren() bereikt. De eerste keer dat het script de methode bereikt uitvoeren() hij ziet dat $eerste_naam referenties “Thom”, bindt die waarde en voert de query uit. Wanneer het script de methode een tweede keer bereikt uitvoeren(), zo ziet hij eruit $eerste_naam verwijst nu naar “John”, bindt die waarde en voert de query opnieuw uit met de nieuwe waarde. Het is belangrijk om te begrijpen dat we het verzoek één keer aanmaken en vervolgens verschillende gegevens op verschillende plaatsen in het script vervangen.
  • bindWaarde() – deze methode berekent de gegevens zodra ze aan de beurt zijn. Sinds de waarde $eerste_naam was ingesteld op "Thom" op het moment dat we de methode bereikten bindWaarde(), zal deze worden gebruikt bij het aanroepen van de methode uitvoeren() Voor $mijn_Insert_Statement.

Houd er rekening mee dat we de variabele hergebruiken $eerste_naam en geef het een tweede keer een nieuwe waarde. Als u uw database controleert nadat u dit script hebt uitgevoerd, zullen beide voornamen aanwezig zijn, in tegenstelling tot deze variabelewaarde $eerste_naam zal aan het einde van dit script gelijk zijn aan “John”. Houd er rekening mee dat PHP de inhoud van een script evalueert voordat het wordt uitgevoerd.

Als u uw script wijzigt door te vervangen bindParam op bindwaarde, voegt u “Thom Vial” twee keer toe aan de MySQL-database en wordt John Smith genegeerd.

Stap 3 - Controleer het succes en los algemene problemen op

Als de query die we in de MySQL-database hebben uitgevoerd succesvol was, zien we het volgende bericht:

Veelvoorkomende fouten oplossen

MySQLi

In elk ander geval wordt er een foutmelding weergegeven in plaats van het bovenstaande bericht. Laten we bijvoorbeeld één syntaxisfout in onze code maken en we krijgen dit:

Zoals we kunnen zien, is het eerste deel van de code in orde, de verbinding is succesvol tot stand gebracht, maar onze SQL-query is mislukt tijdens de uitvoering.

"Fout: INSERT INTO Students (naam, achternaam, e-mailadres) VALUES ("Thom", "Vial", " [e-mailadres beveiligd]") U heeft een fout in uw SQL-syntaxis; controleer de handleiding die overeenkomt met uw MySQL-serverversie voor de juiste syntaxis die u moet gebruiken in de buurt van "(naam, achternaam, e-mail) VALUES ("Thom", "Vial", " [e-mailadres beveiligd]")" op regel 1"

Er is een syntaxisfout opgetreden waardoor ons script mislukt. De fout zat hier:

$sql = "INSERT INTO Students (naam, achternaam, e-mailadres) VALUES ("Thom", "Vial", " [e-mailadres beveiligd]")";

Zoals je kunt zien, gebruiken we accolades in plaats van haakjes. Dit is onjuist en resulteert in een syntaxisfout in ons script.

BOB

Op regel 7 van de PDO-verbinding staat de foutafhandelingsmodus op ‘alle uitzonderingen weergeven’. Als u dit uit het script verwijdert en de aanvraag mislukt, krijgt u geen foutmelding. Als uitzonderingen zijn ingeschakeld, worden de specifieke problemen die u tegenkomt weergegeven. Dit kunt u over het algemeen het beste gebruiken bij het ontwikkelen van een script, omdat hierdoor database- en tabelnamen kunnen worden onthuld die u wilt verbergen voor iedereen die ongeautoriseerde toegang tot uw gegevens zou kunnen krijgen. In het bovenstaande geval, wanneer accolades werden gebruikt in plaats van haakjes, ziet de fout er als volgt uit:

Fatale fout: niet-afgevangen uitzondering "PDOException" met bericht "SQLSTATE: syntaxisfout of toegangsfout: 1064 Er is een fout in uw SQL-syntaxis; controleer de handleiding die overeenkomt met uw MySQL-serverversie voor de juiste syntaxis die u moet gebruiken in de buurt van "(naam, achternaam, e-mail) VALUES ("Thom", "Vial", " [e-mailadres beveiligd]")" op regel 1"

Andere problemen die u kunt tegenkomen:

  • De velden zijn onjuist opgegeven (niet-bestaande velden of verkeerd gespelde namen).
  • Het waardetype komt niet overeen met het veldtype. Bijvoorbeeld wanneer we de waarde van een getal willen toekennen 47 veld Naam, krijgen we een foutmelding omdat de waarde naar verwachting een string is. Maar als u bijvoorbeeld een getal tussen aanhalingstekens opgeeft, “47” , zal er geen fout optreden omdat ons nummer als een string in dit veld wordt geschreven.
  • Een poging om gegevens in te voeren in een tabel die niet bestaat of een fout bij het spellen van de tabelnaam.

Al deze fouten kunnen worden verholpen door de foutcorrectiehandleidingen te volgen of door het foutenlogboek te controleren.

Nadat de gegevens succesvol zijn toegevoegd, zouden we deze in onze database moeten zien. Hier is een voorbeeld van de tabel waaraan we onze gegevens hebben toegevoegd phpMijnAdmin.

Conclusie

In deze tutorial heb je geleerd hoe je het moet gebruiken PHP-code om een ​​record toe te voegen aan een MySQL-tabel gebruiken MySQLi En BOB. We hebben ook gekeken naar veelvoorkomende fouten en hun oplossingen. Weten hoe u PHP-code kunt gebruiken om toe te voegen aan een MySQL-database zal van pas komen, of u nu leert programmeren of al uw eigen website maakt.

In deze tutorial bekijken we hoe u gegevens rechtstreeks vanuit uw PHP-scripts in een database kunt invoegen.

Gegevens invoegen met behulp van SQL

U gebruikt SQL om gegevens in een database in te voegen, op dezelfde manier waarop u SQL gebruikt om databases en tabellen te maken. De SQL-querysyntaxis is:

INSERT INTO Tabelnaam (kolom1, kolom 2, ...) WAARDEN(waarde1, waarde 2, ...)

Zoals u kunt zien, kunt u meerdere kolommen in één SQL-instructie bijwerken door ze op te geven in een door komma's gescheiden lijst. Maar u kunt uiteraard ook slechts één kolom en één waarde opgeven. Kolommen die niet in deze SQL-instructie worden vermeld, blijven leeg.

Voorbeeld: Een nieuwe persoon in een tabel invoegen

In dit voorbeeld gebruiken we de database uit les 18. Stel dat we een persoon in de database willen invoegen. Het zou kunnen Guus Gans met telefoonnummer 99887766 en geboortedatum 1964-04-20 .

De SQL-instructie kan er als volgt uitzien:

$strSQL = "INSERT INTO people(Voornaam, Achternaam, Telefoon, Geboortedatum) VALUES ("Gus", "Gans", "99887766", "20-04-1964"");

Zoals u kunt zien, kunnen SQL-instructies behoorlijk lang zijn en kunt u gemakkelijk het overzicht kwijtraken. Daarom is het beter om de SQL-instructie iets anders te schrijven:

strSQL = "INSERT INTO mensen("; strSQL = strSQL . "Voornaam", "; strSQL = strSQL . "Achternaam," strSQL = strSQL . "Telefoon," strSQL = strSQL . "geboorte)"; strSQL = strSQL . "WAARDEN ("; strSQL = strSQL . ""Gus", "; strSQL = strSQL . ""Gans", "; strSQL = strSQL . ""99887766", "; strSQL = strSQL . ""20/04/1964""); mysql_query($strSQL) of die(mysql_error());

Hier wordt de SQL-instructie opgebouwd door de zin in kleine delen te verdelen en deze vervolgens in een variabele te combineren $strSQL.

In de praktijk is er geen verschil tussen het gebruik van de ene of de andere methode, maar bij het werken met grote tabellen wordt de mogelijkheid om "bij te houden" uiterst belangrijk, dus kies de meest geschikte methode.

Laten we de volgende code proberen om Gus Goose in de database in te voegen:

Gegevens in de database invoeren // Verbinding met de databaseserver mysql_connect("mysql.myhost.com", "gebruiker", "sesam") of die (mysql_error());// Selecteer database mysql_select_db("mijndatabase") of die(mysql_error()); //De SQL-instructie bouwen $strSQL = "INSERT INTO mensen("; $strSQL = $strSQL . "Voornaam", "; $strSQL = $strSQL . "Achternaam", "; $strSQL = $strSQL . "Telefoon," $strSQL = $strSQL . "Geboortedatum"; $strSQL = $strSQL . "WAARDEN("; $strSQL = $strSQL . ""Guus", "; $strSQL = $strSQL . ""Gans", "; $strSQL = $strSQL . ""99887766", "; $strSQL = $strSQL . ""20/04/1964""); // SQL-instructie wordt uitgevoerd mysql_query($strSQL) of die (mysql_error()); //Verbinding sluiten mysql_close();

?>



DB bijgewerkt!

Gebruikersinvoer opslaan in de database

Stel dat u een eenvoudig formulier heeft: Redden Dit formulier wordt bij het bestand ingediend

invoegen.php

, waar u, zoals u in les 11 ziet, gebruikersinvoer kunt ontvangen door de inhoud van het formulier op te vragen. In dit specifieke geval zou de SQL-instructie er als volgt kunnen uitzien:

strSQL = "INSERT INTO people(FirstName) waarden("" . $_POST["FirstName"] . "")"

Op dezelfde manier kunt u gegevens opvragen uit cookies, queryreekssessies, enz.

De meest voorkomende beginnersfouten

In eerste instantie krijgt u waarschijnlijk een aantal foutmeldingen wanneer u de database probeert bij te werken. Bij het werken met een database zijn helemaal geen fouten toegestaan. Een onjuiste komma kan betekenen dat de database niet wordt bijgewerkt en dat u een foutmelding krijgt. Hieronder beschrijven we de meest voorkomende fouten.

Ongeldig gegevenstype

Het is belangrijk dat de gegevens en het gegevenstype van de kolom met elkaar overeenkomen. Elke kolom kan gegevens van een bepaald type bevatten.

De volgende schermafbeelding toont de gegevenstypen van de tabel 'mensen' uit ons voorbeeld. Er wordt een fout gegenereerd als u bijvoorbeeld tekst of een getal in een gegevensveld probeert in te voegen. Stel daarom het gegevenstype zo nauwkeurig mogelijk in. De meest voorkomende gegevenstypen worden hieronder vermeld:
Betekenis
Gegevenstype Maximaal 255 tekens - of de lengte gespecificeerd in "Lengte"
TEKST
Grote blokken tekst of een combinatie van tekst en cijfers. Maximaal 65.535 tekens
INT
Numerieke gegevens voor wiskundige berekeningen. 4 bytes
DATUM
Datums in het formaat JJJ-MM-DD 3 bytes
TIJD
Tijd in het formaat uu:mm:ss 3 bytes
DATUMTIJD
Datum en tijd in de notatie JJJ-MM-DD uu:mm:ss 8 bytes

SQL-instructies met aanhalingstekens of backslashes

Als u tekst probeert in te voegen die enkele aanhalingstekens ("), dubbele aanhalingstekens (") of backslash (\) tekens bevat, wordt de record niet in de database ingevoegd. De oplossing zou zijn om backslashes te vervangen vóór tekens die moeten worden onthouden als ze in databasequery's worden ingevoegd.

In dit artikel bekijken we hoe u PHP kunt gebruiken om rijen in een MySQL-database in te voegen.

Stap 1 - Een tabel maken

Eerst moet u een tabel voor de gegevens maken. Dit is een eenvoudige procedure die u kunt uitvoeren met phpMyAdmin in uw hostingcontrolepaneel.

Na het inloggen op phpMyAdmin ziet u deze interface:
Laten we een tabel maken met de naam Studenten in de database u266072517_name door op de knop "Tabel maken" te klikken. Hierna zien we een nieuwe pagina waarop we alle noodzakelijke tabelparameters instellen:

Dit is de eenvoudigste instelling die voor een tabel kan worden gebruikt en waarmee u meer informatie kunt krijgen over de tabel-/databasestructuur.

Kolomopties:

  • Naam is de kolomnaam die bovenaan de tabel wordt weergegeven.
  • Type — kolomtype. We hebben bijvoorbeeld varchar gekozen omdat we tekenreekswaarden gaan invoeren.
  • Lengte/waarden - Wordt gebruikt om de maximale lengte op te geven die een item in deze kolom kan hebben.
  • Index - We hebben de index 'Primair' gebruikt voor het veld 'ID'. Bij het maken van een tabel wordt aanbevolen om slechts één kolom als primaire sleutel te gebruiken. Het wordt gebruikt om de records in de tabel weer te geven en is vereist bij het opzetten van de tabel. Ik heb ook "A_I" opgemerkt, wat "Auto Increment" betekent - de parameter voor het automatisch toewijzen van recordnummers (1,2,3,4...).
    Klik op de knop "Opslaan" en de tabel wordt aangemaakt.

Stap 2: Schrijf PHP-code om gegevens in MySQL in te voegen.

Optie 1 - MySQLi-methode

Eerst moet u een verbinding met de database tot stand brengen. Hierna gebruiken we de SQL INSERT-query. Volledig codevoorbeeld:

" . mysqli_error($conn); ) mysqli_close($conn); ?>

Het eerste deel van de code (regel 3 - 18) is bedoeld om verbinding te maken met de database.

Laten we beginnen met regel nummer 19:

$sql = "INSERT INTO Students (naam, achternaam, e-mailadres) VALUES ("Thom", "Vial", " [e-mailadres beveiligd]")";

Het voegt gegevens in een MySQL-database in. INSERT INTO is een instructie die gegevens aan een opgegeven tabel toevoegt. In ons voorbeeld worden gegevens toegevoegd aan de tabel Studenten.

Hierna volgt een lijst met kolommen waarin de waarden worden ingevoegd: naam, achternaam, e-mailadres. De gegevens worden in de aangegeven volgorde toegevoegd. Als we (e-mailadres, achternaam, naam) hadden geschreven, zouden de waarden in een andere volgorde zijn toegevoegd.

Het volgende deel is de VALUES-instructie. Hier specificeren we de waarden voor de kolommen: naam = Thom, achternaam = Flacon, e-mail = [e-mailadres beveiligd].

We hebben het verzoek uitgevoerd met behulp van PHP-code. In programmacode moeten SQL-query's worden voorzien van aanhalingstekens. Het volgende stukje code (regel 20-22) controleert of ons verzoek succesvol was:

if (mysqli_query($conn, $sql)) ( echo "Nieuw record succesvol gemaakt"; )

Deze code geeft een bericht weer dat aangeeft dat het verzoek succesvol was.

En het laatste deel (regel 22 - 24) geeft een melding weer als het verzoek niet succesvol was:

else ( echo "Fout: " . $sql . "
". mysqli_error($conn); )

Optie 2 - PHP Data Object (PDO) -methode

Eerst moeten we verbinding maken met de database door een nieuw PDO-object te maken. Bij het werken ermee zullen we verschillende PDO-methoden gebruiken. Objectmethoden worden als volgt aangeroepen:

$het_Object->de_Methode();

Met PDO kunt u SQL-code "voorbereiden" voordat deze wordt uitgevoerd. De SQL-query wordt geëvalueerd en "gecorrigeerd" voordat deze wordt uitgevoerd. Een eenvoudige SQL-injectieaanval kan bijvoorbeeld worden uitgevoerd door simpelweg SQL-code in een formulierveld in te voeren. Bijvoorbeeld:

Omdat dit syntactisch correcte SQL is, maakt de puntkomma van DROP DATABASE user_table een nieuwe SQL-query en wordt de gebruikerstabel verwijderd. Met voorbereide expressies (gebonden variabelen) kunnen puntkomma's en aanhalingstekens de oorspronkelijke query niet beëindigen. Daarom wordt de opdracht DROP DATABASE nooit uitgevoerd.

Om voorbereide expressies te gebruiken, moet u een nieuwe variabele schrijven die de methode prepare() van het databaseobject aanroept.

Juiste code:

getMessage(); ) // Stel variabelen in voor de persoon die we aan de database willen toevoegen $first_Name = "Thom"; $last_Name = "Flacon"; $e-mail = " [e-mailadres beveiligd]"; // Maak een variabele die de methode prepare() van het databaseobject aanroept // De SQL-query die u wilt uitvoeren wordt ingevoerd als een parameter en de tijdelijke aanduidingen worden als volgt geschreven: placeholder_name $my_Insert_Statement = $my_Db_Connection->prepare(" INSERT INTO Students ( naam, achternaam, e-mail) VALUES (:voornaam, :achternaam, :email)"); // We vertellen het script nu welke variabele naar elke tijdelijke aanduiding verwijst om de methode bindParam() te gebruiken // De eerste parameter is de tijdelijke aanduiding in de bovenstaande instructie, de tweede is de variabele waarnaar moet verwijzen $my_Insert_Statement->bindParam(:first_name, $first_Name); $email); // Voer de query uit met behulp van de gegevens die we zojuist hebben gedefinieerd // De methode execute() retourneert TRUE als deze succesvol is en FALSE als dat niet het geval is, waardoor u de mogelijkheid krijgt om uw eigen if-bericht af te drukken ($my_Insert_Statement->execute()) ( echo "Nieuw record succesvol aangemaakt"; ) else ( echo "Kan geen record aanmaken"; ) // Op dit punt kunt u de variabele gegevens wijzigen en een query uitvoeren om meer gegevens aan de database toe te voegen gegevens aan de database $first_Name = "John"; $last_Name = "Smid"; $e-mail = " [e-mailadres beveiligd]"; $my_Insert_Statement->execute(); // Voer opnieuw uit wanneer de variabele wordt gewijzigd if ($my_Insert_Statement->execute()) ( echo "Nieuw record succesvol gemaakt"; ) else ( echo "Kan geen record maken";

Op regels 28, 29 en 30 gebruiken we de methode bindParam() van het databaseobject. Er is ook een bindValue()-methode, die heel anders is dan de vorige.

  • bindParam() - Deze methode evalueert de gegevens wanneer de methode execute() wordt bereikt. De eerste keer dat het script de methode execute() bereikt, ziet het dat $first_Name overeenkomt met "Thom". Bindt vervolgens deze waarde en voert de aanvraag uit. Wanneer het script de tweede methode execute() bereikt, ziet het dat $first_Name nu overeenkomt met "John". Vervolgens wordt deze waarde gebonden en wordt de query opnieuw uitgevoerd met nieuwe waarden. Het is belangrijk om te onthouden dat we een query één keer hebben gedefinieerd en deze opnieuw gebruiken met andere gegevens op verschillende punten in het script.
  • bindValue() - Deze methode evalueert de gegevens zodra bindValue() is bereikt. Omdat $first_Name was ingesteld op "Thom", zal bindValue() elke keer worden gebruikt wanneer de methode execute() wordt aangeroepen op $my_Insert_Statement wanneer bindValue() wordt bereikt.
    Merk op dat we de variabele $first_Name hergebruiken en er een tweede keer een nieuwe waarde aan toekennen. Na het uitvoeren van het script worden beide namen aangegeven in de database, ondanks het feit dat de variabele $first_Name aan het einde van het script de waarde “John” heeft. Houd er rekening mee dat PHP het hele script controleert voordat het wordt uitgevoerd.

Als u het script bijwerkt om bindParam te vervangen door bindValue, voegt u "Thom Vial" tweemaal in de database in en wordt John Smith genegeerd.

Stap 3 - Bevestig succes en los problemen op

Als het verzoek om rijen in de database in te voegen succesvol was, zien we het volgende bericht:

Veelvoorkomende fouten oplossen

MySQLi

In elk ander geval wordt een foutmelding weergegeven. Laten we bijvoorbeeld één syntaxisfout in de code maken en we krijgen het volgende:

Het eerste deel van de code is in orde, de verbinding is succesvol tot stand gebracht, maar de SQL-query is mislukt.

"Fout: INSERT INTO Students (naam, achternaam, e-mailadres) VALUES ("Thom", "Vial", " [e-mailadres beveiligd]") U heeft een fout in uw SQL-syntaxis; controleer de handleiding die overeenkomt met uw MySQL-serverversie voor de rechtensyntaxis die u moet gebruiken in de buurt van "(naam, achternaam, e-mail) VALUES ("Thom", "Vial", " [e-mailadres beveiligd]")" op regel 1"

Er is een syntaxisfout opgetreden waardoor het script crashte. De fout zat hier:

$sql = "INSERT INTO Students (naam, achternaam, e-mailadres) VALUES ("Thom", "Vial", " [e-mailadres beveiligd]")";

We gebruikten accolades in plaats van gewone accolades. Dit is onjuist en het script heeft een syntaxisfout gegenereerd.

BOB

Regel 7 van de PDO-verbinding stelt de foutmodus in op "alle uitzonderingen weergeven". Als het op een andere waarde is ingesteld en het verzoek is mislukt, ontvangen we geen foutmeldingen.

Deze instelling mag alleen worden gebruikt bij het ontwikkelen van een script. Indien geactiveerd kunnen database- en tabelnamen worden weergegeven die om veiligheidsredenen het beste verborgen kunnen worden. In het hierboven beschreven geval, waarbij accolades werden gebruikt in plaats van gewone accolades, ziet de foutmelding er als volgt uit:

Fatale fout: Uncaughtexception "PDOException" met bericht "SQLSTATE: Syntaxisfout of toegangsschending: 1064 Er is een fout opgetreden in uw SQL-syntaxis; controleer de handleiding die overeenkomt met uw MySQL-serverversie voor de juiste syntaxis die u moet gebruiken in de buurt van "(naam, achternaam, e-mail) VALUES ("Thom", "Vial", " [e-mailadres beveiligd]")" op regel 1"

Andere mogelijke problemen:

  • Kolommen zijn onjuist opgegeven (niet-bestaande kolommen of verkeerd gespelde kolomnamen).
  • Eén waardetype wordt toegewezen aan een kolom van een ander type. Als u bijvoorbeeld het getal 47 in de kolom Naam probeert in te voegen, krijgt u een foutmelding. Deze kolom moet een tekenreekswaarde gebruiken. Maar als we een getal tussen aanhalingstekens specificeren (bijvoorbeeld "47") zou het werken, omdat het een string is.
  • Er is geprobeerd gegevens in te voeren in een tabel die niet bestaat. Er zat ook een spelfout in de tabelnaam.

Nadat de gegevens succesvol zijn ingevoerd, zullen we zien dat deze aan de database zijn toegevoegd. Hieronder ziet u een voorbeeld van een tabel waaraan gegevens zijn toegevoegd.

Conclusie

In dit artikel hebben we gedeeld hoe je PHP kunt gebruiken om gegevens in een MySQL-database in te voegen met behulp van MySQLi en PDO. En ook hoe u veelvoorkomende fouten kunt elimineren. Deze kennis komt van pas bij het leren programmeren en bij het ontwikkelen van uw eigen website.

Deze publicatie is een vertaling van het artikel “ Hoe PHP te gebruiken om gegevens in de MySQL-database in te voegen", opgesteld door het vriendelijke projectteam


De les zal gebaseerd zijn op feedbackformulier, noodzakelijk op vrijwel elke website.

Stap één: Een database aanmaken in MySQL

Opening phpMijnAdmin(inbegrepen in het basispakket Denwer`a), en maak een database met de naam " test_basis", selecteer de codering " cp1251_general_ci".

Stap twee: Een tabel maken in MySQL door te gebruiken SQL-query

U kunt uiteraard een tabel maken met standaardhulpmiddelen phpMijnAdmin, maar op deze manier zal de structuur van de tabel die wordt gemaakt duidelijk zichtbaar zijn.

Maak een tabel met de naam " test_tabel" en met zes velden genaamd:
"naam" - gebruikersnamen worden hier opgeslagen;
"e-mail" - e-mailadressen van gebruikers worden hier opgeslagen;
"thema" - het onderwerp van het bericht wordt hier opgeslagen;
"bericht" - berichten worden hier opgeslagen;
"data" - de datum waarop het bericht is verzonden wordt hier opgeslagen;
"id" - identificatienummer van het record (regel), sleutelveld.

SQL-query:
maak tabel test_table(
id int(11) niet nul auto_increment,
naam varchar(255) niet nul,
e-mail varchar(255) niet nul,
thema varchar(255) niet nul,
berichttekst niet nul,
gegevensdatum niet nul,
primaire sleutel (id)
);

Stap drie: Een formulier maken

index.html:

Formulier opgeslagen in MySQL

Voorbeeld van een formulier met gegevensopslag in MySQL

























Een verzoek verzenden
Naam:
E-mail:
Berichtonderwerp:
Bericht:


























Stap vier: Een formulierhandler maken " save_form.php" met het opslaan van de ontvangen gegevens in MySQL

save_form.php:





/* MySQL-tabel waarin de gegevens worden opgeslagen */
$tabel = "test_tabel";

/* Maak een verbinding */

/* Bepaal de huidige datum */
$cdate = datum("J-m-d");

/* We maken een query om informatie in de tabel in te voegen
naam...datum - de naam van specifieke velden in de database;
in $_POST["test_name"]... $_POST["test_mess"] - deze variabelen bevatten gegevens ontvangen van het formulier */
$query = "INSERT INTO $table SET naam="".$_POST["test_name"].", email="".$_POST["test_mail"].",
thema="".$_POST["test_theme"].", message="".$_POST["test_mess"].", data="$cdate"";

/* Sluit de verbinding */
mysql_close();

/* Als het opslaan is gelukt, wordt een bericht en een retourlink weergegeven */
echo("


Gegevens succesvol opgeslagen!



Ga terug
");

Stap vijf: Opgeslagen gegevens weergeven" bekijk_data.php"

bekijk_data.php:

/* Verbinding maken met de database */
$hostnaam = "localhost"; // servernaam/pad, met MySQL
$gebruikersnaam = "root"; // gebruikersnaam (in Denwer is de standaard "root")
$wachtwoord = ""; // gebruikerswachtwoord (in Denwer is er standaard geen wachtwoord, deze parameter kan leeg gelaten worden)
$dbName = "test_base"; // databasenaam


$tabel = "test_tabel";

/* Maak een verbinding */
mysql_connect($hostname, $username, $password) or die("Kan geen verbinding maken");

/* Selecteer een database. Als er een fout optreedt, geeft u deze weer */
mysql_select_db($dbName) of die (mysql_error());

/* We maken een query om gegevens te extraheren uit de velden "naam", "e-mail", "thema",
"bericht", "gegevens" tabellen "test_table" */
$query = "SELECT id, naam, e-mail, thema, bericht, gegevens UIT $table";

/* Voer het verzoek uit. Als er een fout optreedt, geeft u deze weer. */


echo("

Gegevens uit MySQL uitvoeren

Eerder opgeslagen gegevens uit een MySQL-tabel uitvoeren










");



echo "

\N";
echo " \N";
echo " \N";
echo " \N";
echo " \N";
echo " \N";
echo " \N\N";
}

Echo("

# Datum van toegang Gebruikersnamen E-mailadres van gebruikers Berichtonderwerp Gebruikersberichten
".$row["id"]."".$row["gegevens"]."".$row["naam"]."".$row["e-mail"]."".$row["thema"]."".$row["bericht"]."
\N");

/* Sluit de verbinding */
mysql_close();

Stap zes: Records uit de database verwijderen" del_data.php"

del_data.php:

/* Verbinding maken met de database */
$hostnaam = "localhost"; // servernaam/pad, met MySQL
$gebruikersnaam = "root"; // gebruikersnaam (in Denwer is de standaard "root")
$wachtwoord = ""; // gebruikerswachtwoord (in Denwer is er standaard geen wachtwoord, deze parameter kan leeg gelaten worden)
$dbName = "test_base"; // databasenaam

/* MySQL-tabel waarin gegevens worden opgeslagen */
$tabel = "test_tabel";

/* Maak een verbinding */
mysql_connect($hostname, $username, $password) or die("Kan geen verbinding maken");

/* Selecteer een database. Als er een fout optreedt, geeft u deze weer */
mysql_select_db($dbName) of die (mysql_error());

/* Als op de verwijderlink is geklikt, verwijdert u het item */
$del = $query = "verwijder uit $tabel waar (id="$del"");
/* Voer het verzoek uit. Als er een fout optreedt, geeft u deze weer. */
mysql_query($query) of die(mysql_error());



/* Voer het verzoek uit. Als er een fout optreedt, geeft u deze weer. */
$res = mysql_query($query) of die(mysql_error());

$row = mysql_num_rows($res);

/* Gegevens uit de tabel uitvoeren */
echo("

Gegevens uit MySQL uitvoeren en verwijderen

Uitvoeren en verwijderen van eerder opgeslagen gegevens uit een MySQL-tabel











");

/* Cyclus van het uitvoeren van gegevens uit de database met specifieke velden */
while ($row = mysql_fetch_array($res)) (
echo "

\N";
echo " \N";
echo " \N";
echo " \N";
echo " \N";
echo " \N";
echo " \N";
/* Genereer een link om een ​​veld te verwijderen */
echo " \N";
echo "\N";
}

Echo("

# Datum van toegang Gebruikersnamen E-mailadres van gebruikers Berichtonderwerp Gebruikersberichten Verwijdering
".$row["id"]."".$row["gegevens"]."".$row["naam"]."".$row["e-mail"]."".$row["thema"]."".$row["bericht"]."Verwijderen
\N");

/* Sluit de verbinding */
mysql_close();

Stap zeven: Records in de database bewerken en bijwerken " update_data.php"

update_data.php:

/* Verbinding maken met de database */
$hostnaam = "localhost"; // servernaam/pad, met MySQL
$gebruikersnaam = "root"; // gebruikersnaam (in Denwer is de standaard "root")
$wachtwoord = ""; // gebruikerswachtwoord (in Denwer is er standaard geen wachtwoord, deze parameter kan leeg gelaten worden)
$dbName = "test_base"; // databasenaam

/* MySQL-tabel waarin gegevens worden opgeslagen */
$tabel = "test_tabel";

/* Maak een verbinding */
mysql_connect($hostname, $username, $password) or die("Kan geen verbinding maken");

/* Selecteer een database. Als er een fout optreedt, geeft u deze weer */
mysql_select_db($dbName) of die (mysql_error());

/* Als de knop Bewerken is ingedrukt, breng dan wijzigingen aan */
als(@$submit_edit) (
$query = "UPDATE $table SET naam = "$test_name", email = "$test_mail", thema = "$test_theme", message = "$test_mess" WHERE id = "$update"";
/* Voer het verzoek uit. Als er een fout optreedt, geeft u deze weer. */
mysql_query($query) of die (mysql_error());
}

/* We plaatsen de hele database in de $res variabele */
$query = "SELECT * UIT $tabel";
/* Voer het verzoek uit. Als er een fout optreedt, geeft u deze weer. */
$res = mysql_query($query) of die(mysql_error());
/* Ontdek het aantal records in de database */
$row = mysql_num_rows($res);

/* Gegevens uit de tabel uitvoeren */
echo("

Gegevens bewerken en bijwerken

Gegevens in een MySQL-tabel bewerken en bijwerken


");

/* Cyclus van het uitvoeren van gegevens uit de database met specifieke velden */
while ($row = mysql_fetch_array($res)) (
echo "

\N";
echo " \N";
echo " \N";
echo " \N";
echo " \N";
echo "\N";
echo " \N";
echo "\N";
echo " \N";
echo "\N";
echo " \N";
echo "\N";
echo " \N";
echo "\N";
echo " \N";
echo "
#".$row["id"]."
".$row["gegevens"]."
Gebruikersnaam:
E-mailadres van gebruiker:
Berichtonderwerp:
Bericht:
\n\n";
}

/* Sluit de verbinding */
mysql_close();

Nou, dat is alles, veel plezier met coderen:1133:

_________________________________

In dit artikel zullen we misschien enkele van de belangrijkste bekijken SQL-query's. Dit query's om records toe te voegen aan en te verwijderen uit een databasetabel. Omdat het HEEL vaak moet nieuwe records aan de tabel toevoegen, en doe het automatisch, dan moet dit materiaal bestudeerd worden.

Om te beginnen SQL-query om een ​​nieuw record aan een tabel toe te voegen:

INSERT INTO gebruikers (inloggen, doorgeven) waarden("TestUser", "123456")

Wanneer u een item toevoegt, wordt het commando " INVOEREN", dan de naam van de tabel waarin we het record invoegen. Vervolgens staan ​​tussen haakjes de namen van de velden die we willen invullen. En dan tussen haakjes na het woord " waarden"We beginnen de waarden op te sommen van de velden die we hebben geselecteerd. Na het uitvoeren van deze zoekopdracht verschijnt er een nieuw item in onze tabel.

Soms vereist tabelinvoer bijwerken Hiervoor geldt het volgende SQL-query:

UPDATE gebruikers SET login = "TestUser2", pass="1234560" WHERE login="TestUser"

Deze zoekopdracht is complexer, omdat deze de constructie heeft " WAAR", maar hieronder meer daarover. Eerst komt het commando " UPDATE", vervolgens de tabelnaam en daarna " SET"we beschrijven de waarden van alle velden die we willen veranderen. Het zou simpel zijn, maar de vraag rijst: " Welk record moet worden bijgewerkt?". Daarom is er " WAAR". In dit geval werken we het record bij, het veld " login"wat ertoe doet" Testgebruiker". Houd er rekening mee dat als er meerdere van dergelijke records zijn, dan absoluut alles zal worden bijgewerkt! Dit is erg belangrijk om te begrijpen, anders loopt u het risico uw tafel te verliezen.

Laten we het nog even hebben over " WAAR". Naast eenvoudige gelijkheidscontroles zijn er ook ongelijkheden, evenals logische bewerkingen: EN En OF.

UPDATE gebruikers SET login = "TestUser2", pass="1234560" WHERE id< 15 AND login="TestUser"

Gegeven SQL-query zal deze gegevens bijwerken, Identiteitskaart waarvan er minder zijn 15 EN veld " login"doet er toe" Testgebruiker"Ik hoop dat je het ontwerp hebt bedacht" WAAR"omdat het heel belangrijk is. Precies" WAAR" gebruikt wanneer records uit tabellen ophalen, en dit is de meest gebruikte taak bij het werken met databases.

En tot slot: simpel SQL-query om records uit een tabel te verwijderen:

VERWIJDEREN VAN gebruikers WAAR login="TestUser2"

Na het commando " VERWIJDEREN VAN" is de naam van de tabel waarin u records wilt verwijderen. Vervolgens beschrijven we de "WHERE"-constructie. Als het record aan de beschreven voorwaarden voldoet, wordt het verwijderd. Let ook hier weer op, afhankelijk van het aantal records dat voldoet de toestand na " WAAR", een willekeurig aantal ervan kan worden verwijderd.