MySQL veritabanı ile Sorunları

3 Cevap php

Ben kodu ve şimdi sayfa yükleri ve her şey düzenlenmiş, fakat veritabanına eklemek değildir:

<body>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
    require("serverInfo.php");
    mysql_query("UPDATE `cardLists` SET `AmountLeft` = `AmountLeft` + ".mysql_real_escape_string($_POST['Add'])." WHERE `cardID` = '".mysql_real_escape_string($_POST['Cards'])."'");

    echo "\"" .$_POST['Add'] ."\" has been added to the inventory amount for the card \"". $_POST['Cards']. "\"";

    mysql_query("INSERT INTO `log` (`changes`, `amount`, `cardID`, `person`, `date`)VALUES('ADDED',".mysql_real_escape_string($_POST['Add']).",
        ".mysql_real_escape_string($_POST['Cards']).",".mysql_real_escape_string($_POST['Person']).", NOW())") or die (mysql_error());
        mysql_close($link);
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<?php require("serverInfo.php"); ?>
<?php
    $res = mysql_query("SELECT * FROM cardLists order by cardID") or die(mysql_error()); 
    echo "<select name = 'Cards'>"; 
    while($row=mysql_fetch_assoc($res)) { 
        echo "<option value=\"$row[cardID]\">$row[cardID]</option>"; 
    } 
    echo "</select>";
?>
Amount to Add: <input type="text" name="Add" maxlength="8" />
Changes Made By: <select name="Person">
    <option value="justin">Justin</option>
    <option value="chris">Chris</option>
    <option value="matt">Matt</option>
    <option value="dan">Dan</option>
    <option value="tim">Tim</option>
    <option value="amanda">Amanda</option>
</select>
<input type="submit" name ="submit" onClick= "return confirm(
  'Are you sure you want to add this amount?');">
</form>
<br />
<input type="button" name="main" value="Return To Main" onclick="window.location.href='index.php';" />
</body>
</html>

3 Cevap

Ek olarak Date saklıdır kelime dnagirl tarafından dikkat çekti:

....VALUES('ADDED','$_POST['Add']'....

Sen ['x'] burada kullanamazsınız. Sen deneyebilirsiniz:

....VALUES('ADDED','{$_POST['Add']}'....

O biri dışında yanlış çünkü Ya bu, bir dize değişmez, ama şüpheli Tamam olduğu:

....VALUES('ADDED','$_POST[Add]'....

Ama bu yine de bir SQL enjeksiyon bulunuyor. Sen gerekir:

....VALUES('ADDED','".mysql_real_escape_string($_POST['Add'])."'....

Ve bu:

"... + ".mysql_real_escape_string($_POST['Add'])." ... "

Sen kaçış çağrısına rağmen böylece, hala SQL enjeksiyon var, bu değişmez tek tırnak koymak ettik. Bunun tırnak koymak, ya da ya sen, her zaman bir tamsayı var sağlamak kullanmak istiyorsanız intval.

(Parameterised sorgular bilirsin, iyi.)

mysql_close($link);

Ne yapıyor olması gerekiyordu? $link nereden geldi?

... action="<?php echo $_SERVER['PHP_SELF']; ?>" ...

echo "<option value=\"$row[cardID]\">$row[cardID]</option>"; 

echo "\"" .$_POST['Add'] ."\" has been added ..."

HTML enjeksiyon (XSS riski). Lütfen htmlspecialchars hatırlıyorum.

onClick= "return confirm('Are you sure you want to add this amount?');"

Bunun için form onsubmit kullanın.

INSERT INTO `log` 
   (`changes`, `amount`, `cardID`, `person`, Date) //PROBLEM: Date is a reserved word
VALUES
   ('ADDED','$_POST['Add']','$_POST['Cards']', '$_POST['Person']', NOW()) 

Sütun Tarih ayrılmış bir sözcüktür. Bunu teklif veya olmayan bir ayrılmış kelime değiştirmek ya.

Ben hat yankı yapardı

"INSERT INTO `log` (`changes`, `amount`, `cardID`, `person`, Date)VALUES('ADDED','$_POST['Add']','$_POST['Cards']', '$_POST['Person']', NOW())"

parametre değerleri doldurulur ve Tarih elbette değiştirilir, ve sonra veritabanında el koydu ile.

Ve mysql_query dönüş değeri kullanmak ve kullanmak mysql_error:

if (!mysql_query("SELECT * FROM nonexistenttable", $link)) {
  echo mysql_errno($link) . ": " . mysql_error($link) . "\n";
}

EDIT

$var="INSERT INTO `log` (`changes`, `amount`, `cardID`, `person`, Date)VALUES('ADDED','$_POST['Add']','$_POST['Cards']', '$_POST['Person']', NOW())";
echo $var; // will show up in logs
mysql_query($var);