Permalänk
Medlem

Php mysql duplicate entry

Hejsan!
Jag håller på att göra ett litet script som man kan anmäla lag. Jag har satt mina tables som unique i databasen för att hämma duplicate entrys. Men nu vill jag hantera felmeddelanden.

--> Pastebin: http://pastebin.com/DkuxFmrG

på rad 5 har jag lagt in en bit kod som ska kontrollera detta men det vägrar fungera. Någon som kan ha en idé. Fixar verkligen ingen lösning i detta.

Skulle uppskatta ifall någon kan hjälpa mig.
(Jag är super uber rookie förklara så en femåring förstår)

Visa signatur

.:[Main System - Chassi: Fractal Design Define R2 XL - Moderkort: TUF Z370-PLUS GAMING - CPU: Intel i5-8600K - RAM: Corsair Vengeance 2133mhz 8GB x2 - GFX: Nvidia GeForce GTX 1080]:.
Citera för svar!

Permalänk

Du har tillgång till phpmyadmin va och ser hur datan ser ut i databasen?

Ser ut att vara fel på:

$sql = "INSERT INTO lol (id, teamname, player1, player2, player3) VALUES ('','$_POST[teamname]','$_POST[player1]','$_POST[player2]','$_POST[player3]')";

Du måste välja ut datan med strängar ur $_POST-arrayen

$teamname = $_POST['teamname']; $player1 = $_POST['player1']; $player2 = $_POST['player2']; $player3 = $_POST['player3']; $sql = "INSERT INTO lol (id, teamname, player1, player2, player3) VALUES ('','$teamname','$player1','$player2','$player3')";

Sen så bör du även set till att "tvätta" datan du får in så inte folk kan skicka in sql-injections och tex rensa hela din databas.

Allra helst skulle jag använt PDO och prepared statements (http://php.net/manual/en/book.pdo.php och http://php.net/manual/en/pdo.prepare.php) men eftersom du är noob så:

$teamname = mysql_real_escape_string($_POST['teamname']);

etc

Permalänk
Medlem

Man kommer ganska långt med att köra:

$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

i en "global" config/init/whateveryoucallit fil, det saniterar datan ganska väl men man bör ändå vara 100% säker på att datan faktiskt saniteras på korrekt sätt så testa dig fram.

Visa signatur

Hur kan syltkakor överleva i det vilda utan ögon?

Permalänk
Medlem
Skrivet av Cloudburst:

Du har tillgång till phpmyadmin va och ser hur datan ser ut i databasen?

Ser ut att vara fel på:

$sql = "INSERT INTO lol (id, teamname, player1, player2, player3) VALUES ('','$_POST[teamname]','$_POST[player1]','$_POST[player2]','$_POST[player3]')";

Du måste välja ut datan med strängar ur $_POST-arrayen

Alltså scriptet fungerar helt perfekt nu. Allt jag vill göra är att ändra Mysql erroret "duplicate key" eftersom alla kolumner har attributen "UNIQUE". Istället för duplicate key for w/e så ska det gärna stå "Spelare eller lagnamn finns redan"

Skrivet av Cloudburst:

$teamname = $_POST['teamname']; $player1 = $_POST['player1']; $player2 = $_POST['player2']; $player3 = $_POST['player3']; $sql = "INSERT INTO lol (id, teamname, player1, player2, player3) VALUES ('','$teamname','$player1','$player2','$player3')";

Sen så bör du även set till att "tvätta" datan du får in så inte folk kan skicka in sql-injections och tex rensa hela din databas.

Allra helst skulle jag använt PDO och prepared statements (http://php.net/manual/en/book.pdo.php och http://php.net/manual/en/pdo.prepare.php) men eftersom du är noob så:

$teamname = mysql_real_escape_string($_POST['teamname']);

etc

Tack för du förklarade det.

Skrivet av JesperA:

Man kommer ganska långt med att köra:

$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

i en "global" config/init/whateveryoucallit fil, det saniterar datan ganska väl men man bör ändå vara 100% säker på att datan faktiskt saniteras på korrekt sätt så testa dig fram.

Ska jag bara lägga in det eller hur menar du? Vad gör det du skrev?

Visa signatur

.:[Main System - Chassi: Fractal Design Define R2 XL - Moderkort: TUF Z370-PLUS GAMING - CPU: Intel i5-8600K - RAM: Corsair Vengeance 2133mhz 8GB x2 - GFX: Nvidia GeForce GTX 1080]:.
Citera för svar!

Permalänk
Hedersmedlem
Skrivet av xamber:

Alltså scriptet fungerar helt perfekt nu. Allt jag vill göra är att ändra Mysql erroret "duplicate key" eftersom alla kolumner har attributen "UNIQUE". Istället för duplicate key for w/e så ska det gärna stå "Spelare eller lagnamn finns redan"

Gör först en query som försöker plocka ut en rad med samma spelare eller lagnamn. Om du får något MySQL-resultat av frågan så skriv ut ett felmeddelande till användaren om att spelaren/laget redan finns. Om MySQL inte returnerar någon träff — gött, kör `INSERT`.

Det finns mig veterligen inget "bra" sätt att agera på specifika MySQL-fel i PHP. Det enda du får reda på är "något gick fel" (antingen genom ett `error` med den gamla `mysql`-modulen eller ett `exception` med `mysqli`), vilket ju kan vara många olika saker. Man skulle kunna ge sig in i voodoo med strängjämförelser och reguljära uttryck på felmeddelanden, men snälla, gör inte det (fruktansvärt fult och med hög felrisk vid uppdateringar och annat). Fråga helt enkelt databasen innan om det redan finns en sådan spelare/sådant lag.

Om det ska vara en högaktiv databas med många tillägg och möjliga kollisioner per sekund så behöver du även titta på databaslås och annat (så att inte två kontroller av existens av ett visst lagnamn sker samtidigt, båda säger "OK, det finns inte ännu" och sedan två `INSERT` körs direkt efter varandra likväl), men annars är det inget fatalt att bry sig om.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av phz:

Gör först en query som försöker plocka ut en rad med samma spelare eller lagnamn. Om du får något MySQL-resultat av frågan så skriv ut ett felmeddelande till användaren om att spelaren/laget redan finns. Om MySQL inte returnerar någon träff — gött, kör `INSERT`.

Det finns mig veterligen inget "bra" sätt att agera på specifika MySQL-fel i PHP. Det enda du får reda på är "något gick fel" (antingen genom ett `error` med den gamla `mysql`-modulen eller ett `exception` med `mysqli`), vilket ju kan vara många olika saker. Man skulle kunna ge sig in i voodoo med strängjämförelser och reguljära uttryck på felmeddelanden, men snälla, gör inte det (fruktansvärt fult och med hög felrisk vid uppdateringar och annat). Fråga helt enkelt databasen innan om det redan finns en sådan spelare/sådant lag.

Om det ska vara en högaktiv databas med många tillägg och möjliga kollisioner per sekund så behöver du även titta på databaslås och annat (så att inte två kontroller av existens av ett visst lagnamn sker samtidigt, båda säger "OK, det finns inte ännu" och sedan två `INSERT` körs direkt efter varandra likväl), men annars är det inget fatalt att bry sig om.

Tack för svaren uppskattar det verkligen.
Ska se ifall jag kan fixa detta.

Visa signatur

.:[Main System - Chassi: Fractal Design Define R2 XL - Moderkort: TUF Z370-PLUS GAMING - CPU: Intel i5-8600K - RAM: Corsair Vengeance 2133mhz 8GB x2 - GFX: Nvidia GeForce GTX 1080]:.
Citera för svar!

Permalänk
Legendarisk
Skrivet av JesperA:

Man kommer ganska långt med att köra:

$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

i en "global" config/init/whateveryoucallit fil, det saniterar datan ganska väl men man bör ändå vara 100% säker på att datan faktiskt saniteras på korrekt sätt så testa dig fram.

Det här bör absolut inte användas. Du måste behandla din data olika beroende på sammanhanget. Ett sådant här globalt filter ger dig ingen extra säkerhet, det har t.ex. ingenting med databasen att göra, utan kommer bara sabotera input för dig.

Skickades från m.sweclockers.com

Visa signatur

Abstractions all the way down.

Permalänk
Medlem
Skrivet av Tunnelsork:

Det här bör absolut inte användas. Du måste behandla din data olika beroende på sammanhanget. Ett sådant här globalt filter ger dig ingen extra säkerhet, det har t.ex. ingenting med databasen att göra, utan kommer bara sabotera input för dig.

Skickades från m.sweclockers.com

Tyvärr, du har helt fel i allt utom att man kanske vill behandla sin data olika beroende på sammanhanget, men det har inget med säkerheten att göra, inte heller MÅSTE man behandla data olika, och detta fungerar som validering i det trådskaparen skall göra, dessutom skrev jag klart och tydligt att man skall testa så det fungerar som det är tänkt på datan som skall användas och enda gången den "saboterar" datan är just när datan innebär en säkerhetsrisk, det är just det som är själva poängen med data sanitering...

Har du ens testat koden jag postade innan du besvarade inlägget? Testa göra en SQL injection och återkom när du lyckats.

Visa signatur

Hur kan syltkakor överleva i det vilda utan ögon?

Permalänk
Legendarisk
Skrivet av JesperA:

Tyvärr, du har helt fel i allt utom att man kanske vill behandla sin data olika beroende på sammanhanget, men det har inget med säkerheten att göra, inte heller MÅSTE man behandla data olika, och detta fungerar som validering i det trådskaparen skall göra, dessutom skrev jag klart och tydligt att man skall testa så det fungerar som det är tänkt på datan som skall användas och enda gången den "saboterar" datan är just när datan innebär en säkerhetsrisk, det är just det som är själva poängen med data sanitering...

Har du ens testat koden jag postade innan du besvarade inlägget? Testa göra en SQL injection och återkom när du lyckats.

Förutom att det där öht inte svarar på TS fråga och godtyckligt exkluderar olika typer av input från hela ditt program så tar du aldrig hänsyn till databasanslutningens teckenuppsättning.

Skickades från m.sweclockers.com

Visa signatur

Abstractions all the way down.