通过 PHP 页面插入表格不起作用且没有错误提示。

4
我有一段要插入到表中的代码。我的问题是在INSERT INTO categories中,它从未将数据插入到表中,并且没有任何错误提示。我在代码中使用几乎相同的查询插入到其他表中,那里却可以正常工作。有什么线索吗?
<?php 
$action = $_GET['action'] ; 
if ($action=='question')
  question();
elseif ($action=='categories')
  categories();

function question() {
  if ((isset($_SESSION['loggedin']) &&  $_SESSION['loggedin'] == true))
  {
    $include("db.php");
    $category = $_POST['category'] ; 
    $subcategory = $_POST['subCategory'] ; 
    $question = $_POST['question'] ; 
    $answer = $_POST['answer'] ; 

    $query = "INSERT INTO faq (category,subcategory,question,answer)   
      VALUES('.$category.','.$subcategory.','.$question.','.$answer')";
    $success = mysql_query($query);

    if ($success)
    {
      echo '<a href="admin.php" >done >';       
    }
    else 
    {
      echo mysql_error();
    }

  }
}


function categories(){
  if ( ! (isset($_SESSION['loggedin']) && ! $_SESSION['loggedin'] == true))
  {
    include("db.php");
    $category = $_POST['category'] ; 
    $subcategory = $_POST['subCategory'] ; 

    $query = "INSERT INTO categories (category,subcategory)
      VALUES( '$category' , '$subcategory')";
    $success = mysql_query($query);

    if ($success)
    {
      echo '<a href="admin.php" >done>';
    }
    else 
    {
      echo mysql_error();
    }

  }
}
?>

4
你好,Bobby Tables - Shef
1
你不应该以这种方式构建SQL字符串。搜索一下SQL注入,你就会明白为什么。 - JJ.
我知道SQLi的问题,一旦问题解决,我会处理它。 - LeoSam
“没有错误”到底是什么意思?你是否能够到达其中一个“完成”链接?你是否能够到达echo mysql_error();行?哪个插入操作没有成功?当这个问题出现时,你的URL查询字符串是什么(从“?”开始的所有内容)? - jswolf19
插入到类别中运行良好,完成回显。插入到常见问题解答中没有任何反应,白屏无回显无错误,完全没有任何提示。 - LeoSam
如果您使用的代码与问题中提供的不同,请附上当前的代码,以便我们更好地了解您正在处理的内容。 - jswolf19
6个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4

首先,为了帮助调试,请在脚本的顶部添加这两行代码以显示所有产生的错误。但是请不要在生产环境中使用。

error_reporting(E_ALL);
ini_set('display_errors', '1');

改变

$query = "INSERT INTO faq (category,subcategory,question,answer) VALUES('.$category.','.$subcategory.','.$question.','.$answer')";

变成这样:

$query = "INSERT INTO faq (category,subcategory,question,answer) VALUES('".$category."','".$subcategory."','".$question."','".$answer."')";

$answer后面你漏掉了一个.(点);这是一个语法错误,而不是查询错误。

为了让事情更简单,你实际上可以完全省略这些点:

$query = "INSERT INTO faq (category,subcategory,question,answer) VALUES('$category','$subcategory','$question','$answer')";
请注意避免SQL注入攻击,使用mysql_real_escape_string()函数使你的查询更加安全。
另一个问题可能是你的include文件。请尝试更改。
include("db.php");

To

require("db.php");

如果无法找到包含文件,将会失败。在这种情况下,请进行修复!


感谢您的时间,但无论是语法修复还是没有错误报告都无法解决这个问题。 - LeoSam
@Marco 在 $query = "" 行之前尝试执行 print_r($_POST)。这将打印 $_POST 数组并显示其中是否有任何内容。 - Bojangles
有可能输入内容破坏了语句,请尝试使用以下代码: mysql_query($query) or die(mysql_error()); 然后继续执行:echo '<a href="admin.php" >done>'; - Dave Lasley
1
你的建议代码仍存在漏洞。它将生成...VALUES('.TheCategory.','.TheSubcategory.','.TheQuestion.','.TheAnswer.') - Luke Stevenson
@Lucanos,这一点也不吹毛求疵。感谢您指出我的错误! - Bojangles
显示剩余4条评论

4

有几个问题:

  • 如果您要将变量组合成字符串,可以使用“.”字符将它们连接起来,或者可以在双引号括起来的字符串中包含变量,只要字符串是双引号括起来的。在您的代码中,您同时执行了两种方法。
  • 您没有对数据库输入进行清理处理。
  • 您检查“categories”函数的逻辑不正确。
  • 您的超链接标签缺少关闭标签。

请参见下面的修改后代码。

<?php 

$action = $_GET['action'];

if( $action=='question' )
  question();
elseif( $action=='categories' )
  categories();

function question(){
  if( isset( $_SESSION['loggedin'] ) &&  $_SESSION['loggedin'] == true ){

    include( 'db.php' );

    $category = mysql_real_escape_string( $_POST['category'] ); 
    $subcategory = mysql_real_escape_string( $_POST['subCategory'] ); 
    $question = mysql_real_escape_string( $_POST['question'] );
    $answer = mysql_real_escape_string( $_POST['answer'] );

    $query = "INSERT INTO faq ( category , subcategory , question , answer ) VALUES( '{$category}' , '{$subcategory}' , '{$question}' , '{$answer}' )";

    echo "SQL Query to execute: $query"; # Debug Message

    $success = mysql_query( $query );

    if ( $success ){
      echo '<a href="admin.php">done</a>'; 
    }else{
      echo mysql_error();
    }

  }
}


function categories(){
  if( !( isset( $_SESSION['loggedin'] ) || $_SESSION['loggedin']==true ) ){

    include( 'db.php' );
    $category = mysql_real_escape_string( $_POST['category'] ); 
    $subcategory = mysql_real_escape_string( $_POST['subCategory'] );

    $query = "INSERT INTO categories ( category , subcategory ) VALUES ( '{$category}' , '{$subcategory}' )";

    echo "SQL Query to execute: $query"; # Debug Message

    $success = mysql_query( $query );

    if( $success ){
      echo '<a href="admin.php">done</a>';
    }else{
      echo mysql_error();
    }

  }
}

@MarcoDonJuan:请尝试上面修改后的代码。它应该会回显要执行的SQL代码,并在前面加上“要执行的SQL查询:”字样。通过phpMyAdmin或类似工具登录数据库,直接尝试运行SQL查询。代码没问题 - 必须是上述修改后的代码之外的某些问题。无论是db.php文件中的某些内容,还是您正在编辑的字段,或者其他类似的问题。 - Luke Stevenson
为什么db.php会出现错误,而我正在使用相同的文件将其插入到类别中呢?如果你注意到,这里有两个函数,一个是faq,另一个是类别,类别插入时会显示“完成”消息并在数据库中显示数据,而类别则没有错误也没有插入,只有空白页面。 - LeoSam
@MarcoDonJuan:我想说的是,我提供的代码和JamWaffles提供的代码看起来都是正确的。因此,与其试图在一半的图片中找到错误(当似乎不存在错误时),我建议您可能需要查看这个代码所依赖的另一半图片,即依赖项。首先按照上述调试方法进行调试,然后我们再讨论这个建议的优点。 - Luke Stevenson
是的,我已经尝试过了。使用函数“categories”将数据插入到类别中可以正常工作,并显示调试信息。但是,使用函数“question”将数据插入到FAQ中却不起作用,页面只是空白。 - LeoSam
@MarcoDonJuan:所以,简单回答下面的问题——你是否:1)使用了上述代码,2)在浏览器中看到了SQL语句,3)在phpMyAdmin或类似工具中执行了这些语句?除此之外,在phpMyAdmin中执行这些语句时,它们是否成功,还是出现了错误? - Luke Stevenson

2
我曾经遇到同样的问题,使用了or die(mysql_error());,并意识到我没有在一个变量上使用addslashes($string)。它包含需要转义的字符。

0

我在这个问题上卡了很长时间,唯一的解决方案是

使用mysqli代替mysql,因为在新版本的php中,mysql已经被弃用,例如

使用以下方法

并确保正确保持顺序,首先是变量'$conn',然后是方法'mysqli_select_db($conne,'checksum');'中的数据库名称。

同样,在'mysqli_query($conne,$enter_command);'中,先是变量,然后是查询的变量。

$conn=mysqli_connect($mysql_host,$mysql_user,$mysql_password);
mysqli_select_db($conne,'checksum'); // checksum is database name
mysqli_query($conne,$enter_command);
mysqli_close($conne);

同时,在输入数据库表列时,请确保留有空格。

$enter_command = "INSERT INTO dbase (name , lastname , password) VALUES ('".$name."','".$lastname."','".$password."')";

你也可以使用这个语法

$enter_command = "INSERT INTO dbase (name , lastname , password) VALUES ('{$name}','{$lastname}','{$password}')";

尽量避免 SQL 注入

$gender      = mysql_real_escape_string($_POST['gender']);
希望这个能够运行。

0

你的代码运行得很好,问题在于数据库自增未设置。当自增未设置时,无论你运行脚本多少次,都无法插入超过一个记录。如果你遇到这种问题,请检查是否启用了自增。

这并不是真正的错误,但mysql或php的开发人员应该在用户忘记启用自增时发出警告,以便用户有选择修复或忽略它。


0

我曾经遇到过同样神秘的情况。更糟糕的是,在一个远程、相同的数据库上,同样的代码却可以正常工作。解决方法是为所有数据库字段定义一个默认值(任何值)...希望这能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,