WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   PHP-script som tar bort MYSQL som saknar en viss data (https://www.wn.se/forum/showthread.php?t=1059140)

Dakota 2013-09-15 11:59

PHP-script som tar bort MYSQL som saknar en viss data
 
Jag använder MYSQL till ett av mina system. Alla virtuella städer sparas i databasen och information om städerna sparas i kolumner. Ibland inträffar det att kolumnen "Mayor" som sparar ägaren av staden lämnas tom, vilket gör att hela systemet sätts i felläge.

För att åtgärda detta behöver jag logga in och ta bort den stad i databasen som saknar information i kolumnen "Mayor". När det är gjort är det fixat.

Jag skulle vilja att personalen som hjälper mig har tillgång till att fixa detta utan att de ges fullständig åtkomst till PHPMyAdmin. Därför slog tanken mig att man borde kunna fixa det ganska enkelt med ett PHPscript.

Jag sökte runt lite och hittade nedanstående script som jag modifierat lite, tror ni det skulle funka?

PHP-kod:

<?php
$con
=mysqli_connect("example.com","peter","abc123","my_db");
// Check connection
if (mysqli_connect_errno())
  {
  echo 
"Failed to connect to MySQL: " mysqli_connect_error();
  }

mysqli_query($con,"DELETE FROM TOWNY_TOWNS WHERE mayor=''");

mysqli_close($con);
?>

Det jag är osäker på är hur man ska visa scriptet att kolumnen mayor ska vara tom. Var det korrekt att skriva '' utan info inuti?

ANttila 2013-09-15 12:07

Du kan även kolla efter rader där mayor "= 0" i längd och "= NULL".

Skulle rekommendera att du tar bort staden i samma veva när du sätter just mayor till ett tomt värde.

Tsarraz 2013-09-15 12:11

Jag hade nog hellre gjort så scriptet flyttade "förbjudna staden" till felaktiga städer databasen. Så inte nån gjort fel bara och blir förbannand på dig.

Dakota 2013-09-15 12:13

Citat:

Ursprungligen postat av ANttila (Inlägg 20477335)
Du kan även kolla efter rader där mayor "= 0" i längd och "= NULL".

Skulle rekommendera att du tar bort staden i samma veva när du sätter just mayor till ett tomt värde.

Som jag förstår det så är det precis det som scriptet gör? I exemplet på sidan där jag hittade det försvann hela alltet från databasen eftersom just informationen i kolumnen var xxx så då borde väl samma sak ske om informationen är ingenting alls?

http://www.w3schools.com/php/php_mysql_delete.asp

Citat:

Ursprungligen postat av Tsarraz (Inlägg 20477336)
Jag hade nog hellre gjort så scriptet flyttade "förbjudna staden" till felaktiga städer databasen. Så inte nån gjort fel bara och blir förbannand på dig.

Systemet fungerar inte på det sättet. Så det är ej aktuellt.

ANttila 2013-09-15 12:21

Citat:

Ursprungligen postat av Dakota (Inlägg 20477337)
Som jag förstår det så är det precis det som scriptet gör? I exemplet på sidan där jag hittade det försvann hela alltet från databasen eftersom just informationen i kolumnen var xxx så då borde väl samma sak ske om informationen är ingenting alls?.

Ett fält som har värdet NULL är inte samma sak som att ett fält har en tom sträng som värde ("").

Jag vet inte hur du sätter mayor till "tomt". Om inte du heller vet det, så kolla efter fält som både har en tom sträng eller värdet NULL.

Dakota 2013-09-15 12:23

Citat:

Ursprungligen postat av ANttila (Inlägg 20477338)
Ett fält som har värdet NULL är inte samma sak som att ett fält har en tom sträng som värde ("").

Jag vet inte hur du sätter mayor till "tomt". Om inte du heller vet det, så kolla efter fält som både har en tom sträng och värdet NULL.

Förstår inte alls vad du menar. Jag har inte heller gjort systemet som detta ska funka mot, utan det är ett plugin till en spelserver. Det jag vet är att när kolumnen "mayor" är tom så måste staden tas bort för annars kan felet ej lösas.

Om jag försöker förstå dig; Finns det olika sätt att spara ett tomt värde på och man måste veta vilket för att kunna ta bort det från databasen?!

Tsarraz 2013-09-15 12:28

Du kan i MySql bestämma grundvärdet på ditt databasinlägg . Ofta null eller 0.

ANttila 2013-09-15 12:29

Citat:

Ursprungligen postat av Dakota (Inlägg 20477339)
Förstår inte alls vad du menar. Jag har inte heller gjort systemet som detta ska funka mot, utan det är ett plugin till en spelserver. Det jag vet är att när kolumnen "mayor" är tom så måste staden tas bort för annars kan felet ej lösas.

Om jag försöker förstå dig; Finns det olika sätt att spara ett tomt värde på och man måste veta vilket för att kunna ta bort det från databasen?!

Ja, du kan antingen göra det helt tomt (NULL) eller sätta en sträng som inte har några tecken i sig ("").

Så jag rekommenderar att du kollar efter båda alternativen.

Dvs:
Kod:

DELETE FROM TOWNY_TOWNS WHERE TRIM(mayor) = '' OR mayor IS NULL

Conny Westh 2013-09-15 15:29

Citat:

Ursprungligen postat av Dakota (Inlägg 20477339)
Förstår inte alls vad du menar. Jag har inte heller gjort systemet som detta ska funka mot, utan det är ett plugin till en spelserver. Det jag vet är att när kolumnen "mayor" är tom så måste staden tas bort för annars kan felet ej lösas.

Om jag försöker förstå dig; Finns det olika sätt att spara ett tomt värde på och man måste veta vilket för att kunna ta bort det från databasen?!

Du angriper problemet från fel håll.

Du ska införa en regel (constraint) som redan i databasen förhindrar att tupler (förekomster) med Mayor som är NULL aldrig lagras. Skulle en användare försöka spara detta så ska denne få ett felmeddelande.

Felet som du beskriver ska ju aldrig kunna förekomma. Då ska du förhindra att det uppkommer.

Om Mayor är en referens till en primärnyckel i en annan tabell kallas det för "främmande nyckel" (förkortat FK) "Forreign key" på engelska du kan definiera kolumnen att vara "NOT NULL".

tartareandesire 2013-09-17 11:32

Jag tycker precis som Conny att alla lösningar som föreslagits är helt fel väg att gå. Det är att lösa ett problem som aldrig ska behöva uppstå. Se istället till att man inte kan lägga in en stad utan borgmästare. Ifall det är möjligt att göra detta i nuläget (vilket jag förmodar med tanke på att problemet uppstår) så gör ni personer som börjat spela utan namn (?) sura i onödan. Om det går att börja spela utan namn så går det kanske också att ändra namn till en tom sträng? Gör någon detta av misstag (eller pga intrång) så försvinner deras stad?

Men, ja, den kod du presenterade raderar städer där mayor är en tom sträng (inte NULL). Ifall det finns data kopplad till dessa städer i andra tabeller utan FK så kommer denna emellertid ligga kvar och skräpa. Det finns i så fall förhoppningsvis någon metod / funktion / kod i pluginet eller spelservern för att ta bort en stad "på riktigt". Men jag tycker som sagt var att det är en riktigt dålig lösning på problemet.

ANttila 2013-09-17 11:46

Nu verkar det vara så att TS inte har kunskap och ämnet, så en ombyggnad är nog inte aktuellt.

Ta in någon kunnig, eller kör på en fullösning så länge :)

Conny Westh 2013-09-17 13:40

Det är enkelt att göra ett SQL/DDL-script som lägger på en FK-constraint och en not NULL på kolumnen. Jag skulle vilja säga att det är mycket enklare än att i efterhand gå in och städa varje gång man upptäcker att detta fel har uppstått.

Kan vi få se de två tabellernas CREATE-statement så kan man lätt fixa ett script som fixar problemet en gång för alla.

tartareandesire 2013-09-17 15:12

Citat:

Ursprungligen postat av ANttila (Inlägg 20477472)
Nu verkar det vara så att TS inte har kunskap och ämnet, så en ombyggnad är nog inte aktuellt.

Ta in någon kunnig, eller kör på en fullösning så länge :)

Det behövs inte någon omfattande ombyggnad. Koden som presenterades fungerar som sagt var som akut fullösning men sen måste man åtgärda det verkliga problemet. Det är lite grann som en hjärtinfarkt hos en medelålders man som arbetat och stressat för mycket, motionerat för lite och ätit onyttigt i tjugo år. Först måste man behandla det akuta resultatet, sedan måste man åtgärda de verkliga orsakerna. Så fungerar det alltid så snart man går i produktion :) Såvida det inte är ett väldigt snabblöst problem förstås.

ANttila 2013-09-17 15:21

Håller med er vad som borde göras, men jag tror inte det passar TS på kunskaps- och/eller orknivån.

Dakota 2013-09-23 01:03

Tackar för era svar =)
Saken är den att pluginet är skapat i java, och använder sig av MYSQL för att spara information. Det var ungefär där jag insåg att det skulle bli ganska krångligt att försöka modifiera något då jag har noll kunskap överhuvudtaget om java och tror inte ens pluginet har öppen källkod.


Alla tider är GMT +2. Klockan är nu 13:44.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson