该页面基本上是一种向数据库中的products表添加新产品的表单。表单也必须包含图片上传。该函数应该在将任何数据插入数据库之前回显查询。但是,每次按下提交按钮时,它都不会显示查询,并且表单只会自行重置。我尝试了不同的解决方案,但他们没有工作。我将表单操作更改为新的php页面,但仍然无法正常工作。我还尝试使用两种不同的浏览器,并尝试显示错误代码。代码中有什么东西搞乱吗?
<!DOCTYPE>
<?php
include("../includes/db.php");
?>
<html>
<head>
<title>Insert a Product</title>
<script src="//tinymce.cachefly.net/4.3/tinymce.min.js"></script>
<script>tinymce.init({selector:'textarea'});</script>
</head>
<body>
<form name="submit" action="insert_product.php"method="POST"enctype="multipart/from-data">
<table align="center" width="800">
<tr align="center">
<td colspan="8"><h4>Insert New Post Here</h4></td>
</tr>
<tr>
<td align="right"><b>Product Title:</b></td>
<td><input type="text" name="pro_name" /></td>
</tr>
<tr>
<td align="right"><b>Product Price:</b></td>
<td><input type="text" name="price"/></td>
</tr>
<tr>
<td align="right"><b>Product Image:</b></td>
<td><input type="FILE" name="product_image" id="product_image"/></td>
</tr>
<tr>
<td align="right"><b>Product Color:</b></td>
<td><input type="text" name="Color"/></td>
</tr>
<tr>
<td align="right"><b>Product Location:</b></td>
<td>
<select name="location">
<option>Select a Location</option>
<?php
$get_location = "select * from location";
$run_location = mysqli_query($conn, $get_location);
while ($row_location=mysqli_fetch_array($run_location)){
$Loc_name = $row_location['Loc_name'];
$location_id = $row_location['location_id'];
echo "<option value='$location_id'>$Loc_name</option>";
}
?>
</select>
</td>
</tr>
<tr>
<td align="right"><b>Product Supplier:</b></td>
<td><input type="text" name="pro_supplier"/></td>
</tr>
<tr>
<td align="right"><b>Product Cost:</b></td>
<td><input type="text" name="cost"/></td>
</tr>
<tr>
<td align="right"><b>Product Keywords:</b></td>
<td><input type="text" name="pro_keywords"/></td>
</tr>
<tr>
<td align="right"><b>Product Description:</b></td>
<td><textarea name="Pro_desc" cols="20" rows="10"/></textarea></td>
</tr>
<tr align="center">
<td colspan="7"><input type="submit" name="submit" value="Insert Product Now"/></td>
</tr>
</form>
</body>
</html>
<?php
if (isset($_POST['submit']) && isset($_FILES['product_image'])){
$pro_name = $_POST['pro_name'];
$price = $_POST['price'];
$Color = $_POST['Color'];
$cost = $_POST['cost'];
$pro_desc = $_POST['pro_desc'];
$pro_keywords = $_POST['pro_keywords'];
$product_image = $_FILES['product_image']['name'];
$product_imgtmp = addslashes (file_get_contents($_FILES['product_image']['tmp_name']));
echo $insert_product =
"insert into products
(pro_name, price, Color, cost, Pro_desc, pro_keywords, product_image)
VALUES
('$pro_name','$price','$Color','$cost','$pro_desc','$pro_keywords','$product_image')";
if ($conn->query($insert_product) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $insert_product . "<br>" . $conn->error;
}
}
?>
答案 0 :(得分:3)
编辑:再次检查代码并使用更精确的牙齿之后,又注意到了一些错误。请参阅下面的修改。
首先,在这里输入一个拼写错误,from
而不是form
:
enctype="multipart/from-data"
^^^^
应该读作:
enctype="multipart/form-data"
^^^^
然后,您的<form name="submit">
和提交按钮<input type="submit" name="submit"
都具有submit
的相同名称属性。
name="submit"
移除<form>
,发生冲突。 在条件语句中添加else{ echo "Something went wrong..."; }
后,就会从get go开始进入。
错误报告也会帮助你。
现在,db.php
内的任何内容都不为我们所知。由于您使用MySQLi API进行查询,因此它的连接必须是同一个,mysqli_
而不是mysql_
或PDO,如果是这样的话。
“但是,每次按下提交按钮时,都不显示查询”
您的条件声明:
if (isset($_POST['submit'])
&& isset($_FILES['product_image']))
正在检查是否按下了提交AND-&&
文件已设置。
如果该文件“未设置/为空”,您可能希望在此处使用||
(OR)。
对于用户提供的输入,请使用条件!empty()
,它会更好。
可以改为:
if ( isset($_POST['submit']) ){
// do something in here
if( !empty($_FILES['product_image']) ){
// do something else in here
}
else{
// you can do stuff here too for an empty file condition
}
}
HTML stickler:
<!DOCTYPE>
不是正确的doctype声明,应该被视为<!DOCTYPE html>
作为HTML5支持的最低限度方法。
否则,请参阅以下所有有效类型:
<强>脚注:强>
您目前的代码向SQL injection开放。使用mysqli_*
with prepared statements或PDO与prepared statements。
进一步查看您的代码:
<textarea name="Pro_desc"
和$_POST['pro_desc']
。注意name属性中的大写P
?
那些POST数组又区分大小写;错误报告会让你感到有些担忧,undefined index pro_desc
。
它应该是:
$_POST['Pro_desc']
专业提示:在整个代码中使用相同的letter-case约定。您可以快速迷失使用混合大小写变量,它们区分大小写。我的偏好一直是使用变量,数组等所有小写字母。
另外,如果您尝试将上传的文件作为二进制文件插入数据库,则需要使用mysqli_real_escape_string()
转义该数据并将列设置为BLOB或LONGBLOB,具体取决于文件的大小
还要确保没有文件上传限制大小限制。
Rerences:
将error reporting添加到文件的顶部,这有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// Then the rest of your code
旁注:只应在暂存时进行显示错误,而不是生产。
答案 1 :(得分:0)
首先在表单代码中创建空格:
<form name="submit" action="insert_product.php" method="POST" enctype="multipart/from-data">
然后在您的PHP代码上不回应操作,即
更改此
echo $insert_product =
"insert into products
(pro_name, price, Color, cost, Pro_desc, pro_keywords, product_image)
VALUES
('$pro_name','$price','$Color','$cost','$pro_desc','$pro_keywords','$product_image')";
到此
$insert_product =
"insert into products
(pro_name, price, Color, cost, Pro_desc, pro_keywords, product_image)
VALUES
('$pro_name','$price','$Color','$cost','$pro_desc','$pro_keywords','$product_image')";
echo $insert_product;