通过我不打算离开家用电脑的网站上的两个页面,我想使用一个表单将项目输入到我的计算机上托管的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>
它出现在下一页,无论如何都只是说“项目已添加”。如果我在创建未显示的变量之后尝试回显查询。
答案 0 :(得分: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查询中使用,即使您自己输入的有效数据 - 如果名称例如包含'
字符({{1}),也会破坏查询/应用程序例如......)。
因此,安全性始终很重要,这就是您应该切换到PDO(或mysqli)和准备语句的原因。除此之外,不推荐使用O'Neill
函数。
最后一条评论:如果您向外界打开您的网站,那么准备或转义不会保证您的查询中的表格名称;你需要检查一个允许的表名列表,以避免sql注入。
答案 1 :(得分: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";
}
?>
正如其他人所说,你真的不应该允许某人通过表格输入表名。