0

通过一个网站上的两个页面,我不打算离开我的家用计算机,我想使用一个表单将项目输入到我的计算机上托管的 MySQL 数据库中。我以前用几乎相同的东西做过这个,但由于某种原因,这个不起作用。我不担心这个或类似的东西的安全性,因为它不会离开我自己的电脑,我只是希望它能够真正工作。

形式:

<form action='addclothes.php' method='post'><table style="font-family:verdana;font-size:14px;color:#004766;"><tr><td>
Type of clothing:</td><td><select name="type">
<option value="0">---</option>
<option value="dresses">Dress</option>
<option value="tops">Top</option>
<option value="bottoms">Bottom</option>
<option value="shoes">Shoes</option>
<option value="accessories">Accessory</option></select></td></tr>
<tr><td>Name:</td><td><input type="text" name="name"></td></tr>
<tr><td>Path to full image:</td><td><input type="text" name="largeimagepath"></td></tr>
<tr><td>Path to thumbnail:</td><td><input type="text" name="smallimagepath"></td></tr>
<tr><td colspan="2"><center><input type="submit" value="Submit" name="submit"></center></td></tr>
</table></form>

这发送到 addclothes.php,看起来像这样,用 html 封装以保持相同的布局:

<?php

$name = $_POST['name'];
$table = $_POST['type'];
$largepath = $_POST['largeimagepath'];
$thumbpath = $_POST['smallimagepath'];

    $db = mysql_connect("localhost", "root", "******") or die(mysql_error());
    mysql_select_db("Default") or die(mysql_error());

    $query = "INSERT INTO clothes."{$table}" (name, imagepath, thumbimagepath)
 VALUES("{$name}", "{$largepath}", "{$thumbpath}")";
    mysql_query($query) or die(mysql_error()); ?>

<p>Item Added!</p>

它来到下一页,无论如何都只是说“添加了项目”。如果我在创建也没有显示的变量之后尝试回显查询。

4

2 回答 2

1

这是错误的:

$query = "INSERT INTO clothes."{$table}" (name, imagepath, thumbimagepath)
            VALUES("{$name}", "{$largepath}", "{$thumbpath}")";

您需要在查询中使用单引号以避免破坏它(您不引用表名;如果它可以是 mysql 中的保留字,则使用反引号):

$query = "INSERT INTO clothes.`{$table}` (name, imagepath, thumbimagepath)
            VALUES('{$name}', '{$largepath}', '{$thumbpath}')";

另请注意,安全/ sql 注入不仅仅是为了保护您免受恶意人员的侵害;如果您没有正确准备数据以在 sql 查询中使用,即使是您自己输入的有效数据 - 如果名称包含'字符(O'Neill例如...),也可能会破坏查询/应用程序。

所以安全总是很重要,这就是为什么你应该切换到 PDO(或 mysqli)和准备好的语句。除此之外,这些mysql_*功能已被弃用。

最后一条评论:如果您向外界开放您的网站,则任何准备或转义都不会保护您查询中的表名;您需要检查允许的表名列表以避免 sql 注入。

于 2013-03-21T14:03:47.167 回答
0
<?php
    $name = $_POST['name'];
    $table = $_POST['type'];
    $largepath = $_POST['largeimagepath'];
    $smallpath = $_POST['smallimagepath'];

    $name = htmlentities($name);
    $table = htmlentities($table);
    $largepath = htmlentities($largepath);
    $smallpath = htmlentities($smallpath);

    $connection = new PDO('mysql:host=localhost;dbname=Default','root','*****');
    $query = $connection->prepare('INSERT INTO :table (name,imagepath,thumbimagepath) VALUES (:name,:image,:thumb)';

    $query->bindParam(':table', $table);
    $query->bindParam(':name', $name);
    $query->bindParam(':image',$largepath);
    $query->bindParam(':thumb',$smallpath);
    $query->execute();

    if($query->rowCount()) {
        echo "Inserted correctly";
    } else {
        echo "Failure inserting";
    }
?>

正如其他人所说,您真的不应该允许某人通过表单输入表名。

于 2013-03-21T15:42:20.420 回答