Php errno 1048和#x27;列';用户名';不能为空';

Php errno 1048和#x27;列';用户名';不能为空';,php,prepared-statement,Php,Prepared Statement,你能告诉我为什么我的代码不起作用吗?在我的用户名表中有两列,user\u id和username。user_id是自动递增的,所以我的Sql语句中没有这个,我认为这样做是正确的 <?php require('dbConnect.php'); $Number = $_POST['phonenumber']; // The ? below are parameter markers used for variable binding // auto increment does not ne

你能告诉我为什么我的代码不起作用吗?在我的用户名表中有两列,
user\u id
username
。user_id是自动递增的,所以我的Sql语句中没有这个,我认为这样做是正确的

<?php
require('dbConnect.php');
$Number = $_POST['phonenumber'];

// The ? below are parameter markers used for variable binding
// auto increment does not need prepared statements
$query = "INSERT INTO user (username) VALUES (?)";

$stmt = mysqli_prepare($con,$query) or die(mysqli_error($con));
//bind variables

mysqli_stmt_bind_param($stmt,"s",$u);
//$stmt->bind_param("s",$u); 

mysqli_stmt_execute($stmt);



if(mysqli_query($con,$query))
{
echo 'Inserted correctly';
}

else

    {
  echo 'Error';
   echo var_dump($stmt);
    }

mysqli_stmt_close($stmt);
mysqli_close($con);

?>

像这样对自动增量使用null

$query = "INSERT INTO user (user_id,username) VALUES (null,$username)";

$u未设置,为空,您尝试执行它两次,一次使用prepare(好!),一次使用query(坏!)。而不是
echo'Error'执行<代码>回显“错误”。mysqli_错误($con)然后告诉我们错误是什么。然后运行
var\u dump($\u POST)也;出现了什么?顺便说一句;您的问题在这里
$u
,您应该在这里使用
$Number
,错误报告显然会向您抛出一个未定义的变量通知。假设POST数组不是空的。它的起源不得而知。这没有什么区别。事实上,它确实有区别,它让事情变得更糟@Qirel,还有一些原因。你说得对,弗雷德!我直接忽略了查询中的变量,也没有引号!是的,同意,这个问题也太普遍了。虽然我没有麻烦标记,而且我在手机上(甚至不是应用程序,使用浏览器),@fred如果ID是自动递增的,你可以不使用它,就像OP所做的那样,你不必将null作为一个值传递。然后直接在查询中引入变量(open for SQL injection),并通过在字符串周围没有引号引入语法错误。
$query = "INSERT INTO user (user_id,username) VALUES (null,$username)";