过去一小时已经过了这个,无法弄清楚可能导致错误的原因。以前我通过mysql中的命令行填充数据库。它工作正常。但是我想为那些不了解linux / line命令等的普通用户添加一个GUI元素。
所以我决定添加一个将发布到php的html表单。我之前已经在另一个表单上完成了它,因此无法弄清楚可能导致错误的原因。
这是html表单:
<form action="insertjob.php" method="post" class="basic-grey">
<label>Job Title:</label><input type="text" name="job_title" id="job_title"/><br>
<label>Job Description:</label><input type="text" name="job_description" id="job_description"/><br>
<label>Job Location:</label><input type="text" name="job_location" id="job_location"/><br>
<label>Job Category:</label><input type="text" name="job_category" id="job_category"/><br>
<input type="submit" name=submit value="Submit"/>
</form>
然后当用户按下提交时......它会导致......
insertjob.php
<?php
$user = "root";
$password = "*****";
$host = "********";
$dbase = "jobslist";
$table = "jobs_list";
$job_title= $_POST['jobtitle'];
$job_description= $_POST['jobdescription'];
$job_location= $_POST['joblocation'];
$job_category= $_POST['jobcategory'];
$dbc= mysqli_connect($host,$user,$password,$dbase)
or die("Unable to select database");
$query= "INSERT INTO $table ". "VALUES ('$job_title', '$job_description', '$job_location', '$job_category')";
mysqli_query ($dbc, $query)
or die ("Error querying database");
//header('Location: thankyou.html');
mysqli_close($dbc);
?>
我检查过这不是数据库问题。我不认为这是一个连接问题,因为我检查了开发人员工具并且没有错误。我怀疑它可能是变量?
答案 0 :(得分:5)
您的表单元素的名称属性包含单词之间的下划线:
<label>Job Title:</label><input type="text" name="job_title" id="job_title"/><br>
^
<label>Job Description:</label><input type="text" name="job_description" id="job_description"/><br>
^
<label>Job Location:</label><input type="text" name="job_location" id="job_location"/><br>
^
<label>Job Category:</label><input type="text" name="job_category" id="job_category"/><br>
^
但你的POST变量没有:
$job_title= $_POST['jobtitle'];
^
$job_description= $_POST['jobdescription'];
^
$job_location= $_POST['joblocation'];
^
$job_category= $_POST['jobcategory'];
^
所以改为:
$job_title= $_POST['job_title'];
$job_description= $_POST['job_description'];
$job_location= $_POST['job_location'];
$job_category= $_POST['job_category'];
使用错误报告http://php.net/manual/en/function.error-reporting.php会发出“未定义索引...”通知。
$query= "INSERT INTO $table VALUES ('$job_title', '$job_description', '$job_location', '$job_category')";
mysqli_query ($dbc, $query) or die(mysqli_error($dbc));
另外,提交按钮的name属性周围缺少引号。
<input type="submit" name=submit value="Submit"/>
^^^^^^
如果输入数据包含MySQL可能不同意的字符,例如撇号,则还应同时使用stripslashes()
和mysqli_real_escape_string()
。更不用提防止注射(更多内容见下文)。
诺塔:
您目前的代码向SQL injection开放。使用prepared statements或PDO with prepared statements,它们更安全。
脚注:
通常最好实际使用插入的列名。
从他们的例子:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name,...)]
[(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
在你的情况下:
$query= "INSERT INTO $table (job_title, job_description, job_location, job_category)
VALUES ('$job_title', '$job_description', '$job_location', '$job_category')";
另一件事是使用mysqli_error()
对你有利,以便在出现问题时获得真正的错误。
$dbc= mysqli_connect($host,$user,$password,$dbase)
or die("Error " . mysqli_error($dbc));
将error reporting添加到文件的顶部,这有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告应仅在暂存时完成,而不是生产。
修改:检查所有字段是否设置为空:
您也可以isset()
替换!empty()
:
if(isset($_POST['job_title'])
&& isset($_POST['job_description'])
&& isset($_POST['job_location'])
&& isset($_POST['job_category'])
)
{
$job_title= $_POST['job_title'];
$job_description= $_POST['job_description'];
$job_location= $_POST['job_location'];
$job_category= $_POST['job_category'];
}
根据我们的对话,解决方案是使用:
$query= "INSERT INTO $table (id, job_title, job_description, job_location, job_category)
VALUES ('','$job_title', '$job_description', '$job_location', '$job_category')";
关于你得到的错误,是:
列数与第1行的值计数不匹配