在php中查询数据库时出错.变量中的语法错误?

Sup*_*own 1 php mysql

过去一小时已经过了这个,无法弄清楚可能导致错误的原因.以前我通过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>
Run Code Online (Sandbox Code Playgroud)

然后,当用户按下提交...它导致...

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);

?>
Run Code Online (Sandbox Code Playgroud)

我检查过这不是数据库问题.我不认为这是一个连接问题,因为我检查了开发人员工具并且没有错误.我怀疑它可能是变量?

Fun*_*ner 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>
                                                        ^
Run Code Online (Sandbox Code Playgroud)

但是你的POST变量没有:

$job_title= $_POST['jobtitle'];
                       ^
$job_description= $_POST['jobdescription'];
                             ^
$job_location= $_POST['joblocation'];
                          ^
$job_category= $_POST['jobcategory'];
                          ^
Run Code Online (Sandbox Code Playgroud)

所以改为:

$job_title= $_POST['job_title'];
$job_description= $_POST['job_description'];
$job_location= $_POST['job_location'];
$job_category= $_POST['job_category'];
Run Code Online (Sandbox Code Playgroud)

使用错误报告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));
Run Code Online (Sandbox Code Playgroud)

另外,提交按钮的name属性周围缺少引号.

<input type="submit" name=submit value="Submit"/>
                          ^^^^^^
Run Code Online (Sandbox Code Playgroud)

如果您的输入数据包含MySQL可能不同意的字符,例如撇号,您也应该同时使用stripslashes()mysqli_real_escape_string().更不用说保护免受注射(更多内容见下文).


诺塔:

您现在的代码对SQL注入是开放的.使用准备好的语句,或PDO与准备好的语句,它们更安全.


脚注:

通常最好实际使用插入的列名.

从他们的例子:

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] ... ]
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

$query= "INSERT INTO $table (job_title, job_description, job_location, job_category) 
         VALUES ('$job_title', '$job_description', '$job_location', '$job_category')";
Run Code Online (Sandbox Code Playgroud)

另一件事是利用mysqli_error()你的优势,以获得真正的错误,如果某个地方出现问题.

$dbc= mysqli_connect($host,$user,$password,$dbase)
 or die("Error " . mysqli_error($dbc));
Run Code Online (Sandbox Code Playgroud)

错误报告添加到文件的顶部,这将有助于查找错误.

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code
Run Code Online (Sandbox Code Playgroud)

旁注:错误报告应该只在暂存中完成,而不是生产.


编辑:检查所有字段是否设置为空:

您也可以替换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'];

}
Run Code Online (Sandbox Code Playgroud)

根据我们的对话,解决方案是使用:

$query= "INSERT INTO $table (id, job_title, job_description, job_location, job_category) 
         VALUES ('','$job_title', '$job_description', '$job_location', '$job_category')";
Run Code Online (Sandbox Code Playgroud)

关于你得到的错误,是:

列数与第1行的值计数不匹配