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

时间:2015-03-12 15:42:38

标签: 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>

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

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

?>

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

1 个答案:

答案 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 statementsPDO 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行的值计数不匹配