Avatar billede YoJonas Nybegynder
27. februar 2011 - 17:44 Der er 38 kommentarer og
1 løsning

phpMyAdmin: Min backend er skør?

Hej alle,

Jeg er i gang med en hjemmeside og har brugt phpMyAdmin til at lave en backend. I mine felter som bare er en normal formular har jeg et felt som bare er til noget tekst. Men! Når jeg redigerer i den er det ikke altid den vil godtage det jeg har skrevet - det vil sige, nogle gange vil den godtage noget af det jeg har skrevet og nogle gange vil den ikke. Men hvis jeg går ind i selve phpMyAdmin er der ingen problemer. Men det holder naturligvis ikke når den bliver lagt ud på the world wide web!

Så hvad kan der være galt? Jeg har både prøvet at kalde det for text og longtext men intet hjælper? Er der noget jeg fuldstændig har overset eller hvorfor teer den sig sådan?

Håber der er nogle nørder i blandt der kan hjælpe :)

Jonas
Avatar billede jakobdo Ekspert
27. februar 2011 - 19:20 #1
Kan det skyldes du ikke escaper input?
Så f.eks. ' eller " fucker det up?
Avatar billede YoJonas Nybegynder
27. februar 2011 - 21:16 #2
Det kan godt være det er det som gør det faktisk! Hvordan får jeg tjekket/ordnet det?
Avatar billede jakobdo Ekspert
27. februar 2011 - 21:36 #3
Enten med mysqli eller også skal du kigge på mysql_real_escape_string()
Men du kunne jo prøve at udskrive SQL'en, inden den skydes af.
Avatar billede YoJonas Nybegynder
27. februar 2011 - 22:00 #4
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("yojonas", $con);

$result = mysql_query("SELECT * FROM portfolio_item ORDER BY id DESC");

while($row = mysql_fetch_array($result))
  {

- Sådan ser min kode ud. Kan jeg smide den ind i noget af det?
Avatar billede jakobdo Ekspert
28. februar 2011 - 09:13 #5
Der trækker du info ud.
Som jeg forstår det, så er det når du indsætter data ikke ?
Avatar billede YoJonas Nybegynder
28. februar 2011 - 10:12 #6
Jo - det er rigtigt. Nu er jeg ikke så etableret i php, men hvor skal jeg ellers smide det ind?
Avatar billede jakobdo Ekspert
28. februar 2011 - 10:22 #7
Har du ikke noget update eller insert et sted?
Avatar billede YoJonas Nybegynder
28. februar 2011 - 18:20 #8
Jo den ser sådan her ud i stedet for:

  <?php
if (isset($_GET['update'])) {
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("yojonas", $con);

mysql_query("UPDATE blog SET pic_link = '".$_GET['pic_link']."', headline = '".$_GET['headline']."', date = '".$_GET['date']."', text = '".$_GET['text']."'");

mysql_close($con);
}
?>

<?php
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("yojonas", $con);

$result = mysql_query("SELECT * FROM blog WHERE id = '".$_REQUEST['ID']."'");

while($row = mysql_fetch_array($result))
  {
?>
Avatar billede jakobdo Ekspert
28. februar 2011 - 20:14 #9
Dette er noget "MEGA" føj...
mysql_query("UPDATE blog SET pic_link = '".$_GET['pic_link']."', headline = '".$_GET['headline']."', date = '".$_GET['date']."', text = '".$_GET['text']."'");

Du må ikke tage data direkte fra $_GET og smide ind i sql.
Du bør sikre pic_link, headline, date, text er korrekte data formatter.
date kunne man f.eks. tjekke at det rent faktisk indeholde:

YYYY-MM-DD eller lign.
og ligeledes med de andre.
Og disse bør du også smide igennem mysql_real_escape_string() inden du smider dem i db.
Avatar billede YoJonas Nybegynder
28. februar 2011 - 20:52 #10
Jeg er stadig lidt lost må jeg nok indrømme. Kan forstå det med f.eks. date - men det er nu ikke det der gør mest ondt på mig. Det er nok at jeg stadig ikke ved hvor jeg skal smide mysql_real_escape_string() ind henne i min kode.
Avatar billede jakobdo Ekspert
28. februar 2011 - 20:58 #11
Hvis vi glemmer alt om tjek, men kun vil undgå inputs som ' og " skulle ødelægge din sql, så kunne det se sådan ud:

<?php
if (isset($_GET['update'])) {
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("yojonas", $con);

mysql_query("UPDATE blog SET pic_link = '".mysql_real_escape_string($_GET['pic_link'])."', headline = '".mysql_real_escape_string($_GET['headline'])."', date = '".mysql_real_escape_string($_GET['date'])."', text = '".mysql_real_escape_string($_GET['text'])."'");

mysql_close($con);
}
?>

<?php
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("yojonas", $con);

$result = mysql_query("SELECT * FROM blog WHERE id = '".$_REQUEST['ID']."'");

while($row = mysql_fetch_array($result))
  {
?>
Avatar billede YoJonas Nybegynder
28. februar 2011 - 21:39 #12
Det virker perfekt! Tusind mange tak for hjælpen! Du er for vild!
Avatar billede jakobdo Ekspert
28. februar 2011 - 21:41 #13
Svar!
Avatar billede YoJonas Nybegynder
28. februar 2011 - 21:55 #14
Ved nærmere test så har det også den negative effekt, at den ændre alle mine "id"er til det samme?
Avatar billede jakobdo Ekspert
28. februar 2011 - 22:12 #15
Til det samme ???
Avatar billede YoJonas Nybegynder
28. februar 2011 - 22:27 #16
Ved f.eks. den kode vi har taget, når jeg indsætter den og laver en update. Så skifter den pic_link, headline, date og text til det samme på alle mine id'er - så det hele får det samme indhold?
Avatar billede jakobdo Ekspert
01. marts 2011 - 08:19 #17
Du mangler vel også en WHERE id = 1 eller lign i din update.
Ellers er det klart du vil opdatere alle rækker...
Avatar billede YoJonas Nybegynder
01. marts 2011 - 12:56 #18
Skal den stå i det samme stykke som allerede ligger i tråden?
Avatar billede jakobdo Ekspert
01. marts 2011 - 13:06 #19
Ja, men det er desværre svært at se hvad du vil.
For du har ikke nogen steder vist kode, som kalder din update kode, med et ID eller lign.
Avatar billede YoJonas Nybegynder
01. marts 2011 - 17:13 #20
Well. Det sidste der er i min update er dette:

<form>
<table width="800" border="0">
  <tr>
    <td width="275" valign="top">Link</td>
    <td width="515"><textarea cols="70" rows="2" input type="text" name="pic_link" /><?php echo $row['pic_link']; ?></textarea></td>
  </tr>
  <tr>
    <td width="275" valign="top">Headline</td>
    <td width="515"><textarea cols="70" rows="2" input type="text" name="headline" /><?php echo $row['headline']; ?></textarea></td>
  </tr>
  <tr>
    <td width="275" valign="top">Date</td>
    <td width="515"><textarea cols="70" rows="2" input type="text" name="date" /><?php echo $row['date']; ?></textarea></td>
  </tr>
  <tr>
    <td width="275" valign="top">Text</td>
    <td width="515"><textarea cols="70" rows="2" input type="text" name="text" /><?php echo $row['text']; ?></textarea></td>
  </tr>
  <tr>
      <td><input name="ID" type="hidden" value="<?php echo $row['id']; ?>"</td>
    <td><br /><input type="submit" name="update" /></td>
  </tr>
</table>
</form>

                       
<?php                     
  }

mysql_close($con);
?>
Avatar billede jakobdo Ekspert
01. marts 2011 - 18:41 #21
Og der har du netop:
<td><input name="ID" type="hidden" value="<?php echo $row['id']; ?>"</td>

Så vi skal huske en:

mysql_query("UPDATE blog SET pic_link = '".mysql_real_escape_string($_GET['pic_link'])."', headline = '".mysql_real_escape_string($_GET['headline'])."', date = '".mysql_real_escape_string($_GET['date'])."', text = '".mysql_real_escape_string($_GET['text'])."' WHERE id = intval($_GET['id']) LIMIT 1");
Avatar billede YoJonas Nybegynder
01. marts 2011 - 19:32 #22
Når jeg smider den ind kommer den dog og siger:

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /Applications/XAMPP/xamppfiles/... (og så videre) on line 40

Og linie 40 er det vi lige skulle huske? :)
Avatar billede YoJonas Nybegynder
01. marts 2011 - 19:53 #23
Kan umildbart kun se at det skulle være et "mellemrum" der skulle være galt. Men jeg kan ikke se hvor filan det skulle være henne.
Avatar billede jakobdo Ekspert
01. marts 2011 - 20:13 #24
Prøv at ret:

WHERE id = intval($_GET['id']) LIMIT 1");

til:

WHERE id = ".intval($_GET['id'])." LIMIT 1");
Avatar billede YoJonas Nybegynder
01. marts 2011 - 20:18 #25
Nu melder den ingen fejlkode - heldigvis. Men når jeg updater, virker det bare ikke?
Avatar billede YoJonas Nybegynder
01. marts 2011 - 20:54 #26
Er det noget i formens submit der er galt?
Avatar billede jakobdo Ekspert
01. marts 2011 - 21:01 #27
Svært at sige, når jeg ikke har den fulde kode.
Du burde have fået alle dele til fungerende kode. :o)
De skal bare sættes korrekt sammen.
Avatar billede YoJonas Nybegynder
01. marts 2011 - 21:14 #28
Den fulde kode ser sådan set sådan her ud:

<?php
if (isset($_GET['update'])) {
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("yojonas", $con);

mysql_query("UPDATE blog SET pic_link = '".mysql_real_escape_string($_GET['pic_link'])."', headline = '".mysql_real_escape_string($_GET['headline'])."', date = '".mysql_real_escape_string($_GET['date'])."', text = '".mysql_real_escape_string($_GET['text'])."' WHERE id = ".intval($_GET['id'])." LIMIT 1");

mysql_close($con);
}
?>

<?php
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("yojonas", $con);

$result = mysql_query("SELECT * FROM blog WHERE id = '".$_REQUEST['ID']."'");

while($row = mysql_fetch_array($result))
  {
?>

<form>
<table width="800" border="0">
  <tr>
    <td width="275" valign="top">Link</td>
    <td width="515"><textarea cols="70" rows="2" input type="text" name="pic_link" /><?php echo $row['pic_link']; ?></textarea></td>
  </tr>
  <tr>
    <td width="275" valign="top">Headline</td>
    <td width="515"><textarea cols="70" rows="2" input type="text" name="headline" /><?php echo $row['headline']; ?></textarea></td>
  </tr>
  <tr>
    <td width="275" valign="top">Date</td>
    <td width="515"><textarea cols="70" rows="2" input type="text" name="date" /><?php echo $row['date']; ?></textarea></td>
  </tr>
  <tr>
    <td width="275" valign="top">Text</td>
    <td width="515"><textarea cols="70" rows="2" input type="text" name="text" /><?php echo $row['text']; ?></textarea></td>
  </tr>
  <tr>
      <td><input name="ID" type="hidden" value="<?php echo $row['id']; ?>"</td>
    <td><br /><input type="submit" name="update" /></td>
  </tr>
</table>
</form>

                       
<?php                     
  }

mysql_close($con);
?>

Alt andet der ligger omkring er bare almindelig html.
Avatar billede jakobdo Ekspert
02. marts 2011 - 08:32 #29
Prøv lige selv. :o)
Avatar billede YoJonas Nybegynder
02. marts 2011 - 17:12 #30
Det eneste jeg kan få øje på skulle være i vejen var at:

<td><input name="ID" type="hidden" value="<?php echo $row['id']; ?>"</td>

skulle være:

<td><input name="ID" type="hidden" value="<?php echo $row['id']; ?>" /></td>

Men det hjælper ingenting?
Avatar billede YoJonas Nybegynder
02. marts 2011 - 20:15 #31
Har accepteret svaret nu i hvert fald. Håber du lige kan hjælpe mig med det sidste step.. Kan ikke se hvad filan der skulle være galt.
Avatar billede jakobdo Ekspert
02. marts 2011 - 20:31 #32
Takker for point.
Avatar billede YoJonas Nybegynder
02. marts 2011 - 20:36 #33
Tak for hjælpen. Du vil ikke give mig svaret på det sidste? :)
Avatar billede YoJonas Nybegynder
02. marts 2011 - 20:43 #34
Du skal nok få nogle flere point, hvis det er det du fisker efter. Du har været en stor hjælp, men lige nu vil jeg bare gerne have det til at fungere, så jeg kan komme videre :)
Avatar billede jakobdo Ekspert
02. marts 2011 - 20:50 #35
Jeg tror problemet er, at du udskriver:

<td><input name="ID" type="hidden" value="<?php echo $row['id']; ?>"</td>

Flere gange, så det er den sidste linje med ID som "tæller"

Du skal evt. ændre det til:

<td><input name="ID[]" type="hidden" value="<?php echo $row['id']; ?>"</td>

Dog er jeg usikker på hvordan din kode efterhånden ser ud "live".
Avatar billede YoJonas Nybegynder
02. marts 2011 - 21:01 #36
Det virker i hvert fald ikke. Denne gang når jeg trykker på submit mister siden bare formen. Men den updater ikke.
Avatar billede jakobdo Ekspert
02. marts 2011 - 21:06 #37
Nej og er nok ved at give op. :o)
Avatar billede YoJonas Nybegynder
02. marts 2011 - 21:12 #38
Okay, hehe. Hvis man tager den tilbage til begyndelsen er der så en anden måde at skrive mysql_real_escape_string() ind på?
Avatar billede jakobdo Ekspert
02. marts 2011 - 21:17 #39
Hvis integer, så kan du tjekke med:
is_numeric() og intval()
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester