为啥我的 4 个 PHP 输入中只有 1 个正确写入数据库? [关闭]

Posted

技术标签:

【中文标题】为啥我的 4 个 PHP 输入中只有 1 个正确写入数据库? [关闭]【英文标题】:Why does only 1 out of my 4 PHP inputs correctly write into the database? [closed]为什么我的 4 个 PHP 输入中只有 1 个正确写入数据库? [关闭] 【发布时间】:2014-02-27 05:54:44 【问题描述】:

这是我的 html - 表单在一个大表中,因为我最终希望从数据库输出的数据在那里。

<form name="form1" method="post" action="php/InsertMatch.php" >
            <table>
                <tr>
                    <td>Hero</td>
                    <td>Result</td>
                    <td>Game Mode</td>
                    <td>MMR</td>
                    <td>Diff</td>
                </tr>
                <tr>
                    <td>Keeper of the light</td>
                    <td>Win</td>
                    <td>All Pick</td>
                    <td>3500</td>
                    <td>--</td>
                </tr>
                <tr>
                    <td><input id="select_hero" type="text" name="select_hero"></td>
                    <td>
                        <select name="winloss">
                            <option value="win">Win</option>
                            <option value="loss">Loss</option>
                        </select>
                    </td>
                    <td>
                        <select name="gamemode">
                            <option value="allpick">All Pick</option>
                            <option value="capmode">Captains Mode</option>
                            <option value="capdraft">Captains Draft</option>
                        </select>
                    </td>
                    <td><input id="input_mmr" type="text" name="input_mmr"></td>
                    <td>N/a</td>
                </tr>
            </table>
            <input id="submit_game" type="submit" name="submit" value="Submit game">
        </form>

以上总结:要输入数据库的 4 件事。两个文本输入(均无效)和两个下拉框。唯一有效的似乎是winloss 函数。我将在现在出现的 PHP 下方显示数据库条目:

<?php

$host="localhost";
$username="root";
$password="";
$db_name="dota_site_test";
$tbl_name="matches";

mysql_connect("$host", "$username", "$password") or die ("cannot connect");
mysql_select_db("$db_name") or die("cannot select DB");

//names from form.
$hero=$_POST['select_hero'];
$winloss=$_POST['winloss'];
$gamemode=$_POST['gamemode'];
$mmr=$_POST['input_mmr'];

//data into mysql

$sql="INSERT INTO $tbl_name(Hero, Result, GameMode, MMR)VALUES('$hero', '$winloss', 'gamemode', 'mmr')";
$result=mysql_query($sql);

//if successful, displays message

if($result)
    echo "Successful";
    echo "<br />";
    echo "<a href='d2index.php'>Back to main page</a>";


else
echo "ERROR";

?>

我不确定上面有什么问题,我会假设什么?因为我大部分都是从这里使用的:http://www.phpeasystep.com/mysql/5.html

这是我从 2 个具有不同输入的条目中获得的数据库:

0 | win | gamemode | 0
0 | loss| gamemode | 0

因此只有winloss 似乎有效..

如果需要,这里是数据库表信息的图片:http://imgur.com/OPcNmFl

编辑:哎呀。我已经添加了 $ 符号,现在 MMRgamemode 工作正常。但不是hero 函数。有什么想法吗?

EDIT2:感谢您对 SQL 注入攻击的警告。我承认此代码非常不安全(仅托管在我的 PC 上),因此我警告任何阅读此代码的人要注意这一点。谢谢。

【问题讨论】:

你在$sql="INSERT INTO $tbl_name(Hero, Result, GameMode, MMR)VALUES('$hero', '$winloss', 'gamemode', 'mmr')";行中错过了gamemodemmr前面的$ 您的主要问题是您仍在使用已弃用的mysql_ 扩展,这使您的代码容易受到微不足道的 SQL 注入攻击。 .将 mysqli_ 与准备好的语句或 PDO 一起使用。 此代码欢迎SQL注入 不要使用显示旧 MySQL 扩展的教程,寻找使用 MySQLi 或 PDO 的教程以及准备好的语句和绑定变量(例如 mattbango.com/notebook/code/…) @Prashank 我知道这段代码在防范 SQL 注入方面很差。但是目前我已经学习 PHP/MYsql 2 天了。所以我主要专注于学习如何将元素输入数据库。这一切都只托管在我的电脑上。因此,如果她愿意,唯一可以 SQL 注入我的东西的人就是我的女朋友。我希望不会。 【参考方案1】:

除了广为人知的SQL Injection Attack 漏洞之外,也许还有这个?

INSERT [..snip...] VALUES('$hero', '$winloss', 'gamemode', 'mmr')"
                                                ^--no $     ^---no $

您正在尝试插入固定不变的字符串,而不是您之前定义的变量。

【讨论】:

另外,hero 似乎是一个数字 ID 字段,他正试图将文本放入其中。 @DigitalChris 这也可能是个问题。 @DigitalChris,这同样适用于 MMR——插入文本的 int(20) 字段(添加 $ 后) @k4kuz0,阅读第一条评论。您正在尝试将文本插入数字字段。 是的,谢谢@AlexanderMP 咳嗽【参考方案2】:

这可能是因为您忘记在查询中添加$ 符号。

应该是这样的

$sql="INSERT INTO $tbl_name(Hero, Result, GameMode, MMR)VALUES('$hero', '$winloss', '$gamemode', '$mmr')";

【讨论】:

以上是关于为啥我的 4 个 PHP 输入中只有 1 个正确写入数据库? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不使用 for 循环时会发生正确的碰撞,但是当我使用 for 循环时只有 1 个对象有碰撞?

为啥这个表我这样写sql不能查出姓名只有两个汉字的学生信息

C题:为啥char实际上占用了4个字节的内存?

sublime text写python代码时,tab缩进只有两个空格,怎么改成4个

为啥只有 25 个并发用户,服务器 CPU 使用率达到 100%?

为啥memset不能将数组元素初始化为1