【问题标题】:Problems with MYSQL databaseMYSQL数据库的问题
【发布时间】:2010-04-22 15:16:11
【问题描述】:

我编辑了代码,现在页面加载和一切,但它没有插入数据库:

<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>

【问题讨论】:

    标签: php mysql html


    【解决方案1】:

    除了dnagirl指出的Date保留字:

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

    你不能在这里使用['x']。你可以试试:

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

    或者这个,在字符串字面量中是可以的,但由于在字面量之外是错误的,所以值得怀疑:

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

    但这仍然是 SQL 注入。你需要:

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

    还有这个:

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

    您没有在该文字周围加上单引号,因此尽管进行了转义调用,但您仍然有 SQL 注入。或者在它周围加上引号,或者如果你想确保它始终是一个整数,请使用intval

    (参数化查询很好,你知道。)

    mysql_close($link);
    

    那应该是做什么的? $link哪里来的?

    ... action="<?php echo $_SERVER['PHP_SELF']; ?>" ...
    
    echo "<option value=\"$row[cardID]\">$row[cardID]</option>"; 
    
    echo "\"" .$_POST['Add'] ."\" has been added ..."
    

    HTML 注入(XSS 风险)。记住你的htmlspecialchars

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

    为此使用form onsubmit

    【讨论】:

    • 我不知道如何使用 intval 但我会查一下
    • 在该行中添加了更多关于模板问题的内容
    【解决方案2】:
    INSERT INTO `log` 
       (`changes`, `amount`, `cardID`, `person`, Date) //PROBLEM: Date is a reserved word
    VALUES
       ('ADDED','$_POST['Add']','$_POST['Cards']', '$_POST['Person']', NOW()) 
    

    日期列是保留字。引用它或将其更改为非保留字。

    【讨论】:

    • 我改了字还是没解决问题
    • mysql_query("INSERT INTO etc... ") or die (mysql_error());检查错误
    【解决方案3】:

    我会回应这条线

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

    参数值填好,当然还有Date替换,然后手动放到数据库中。

    并使用mysql_query的返回值,并使用mysql_error

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

    编辑

    $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);
    

    【讨论】:

    • 回显该行是什么意思?
    猜你喜欢
    • 2010-10-27
    • 2011-02-13
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2010-12-10
    相关资源
    最近更新 更多