2017-08-04 106 views
1

这段代码应该检查现有的用户名,如果没有,它应该创建一个新的。不管它不会添加什么。另外,正如你在代码中看到的那样,它只是回声'在这里',并不回应'不在这里'。PHP没有发布到mySQL数据库

<?php 

$password = "hey"; 
$username = "hi"; 
require "conn.php"; 
//$password = $_POST["password"]; 
//$username = $_POST["username"]; 

echo 'here'; 
$result = $conn->query("SELECT * FROM UserData WHERE username ='$username' ", MYSQLI_USE_RESULT); 
echo 'not here'; 
if ($result) { 

    if($result->num_rows === 0) 
    { 

     $stmt = $conn->prepare("INSERT INTO UserData (username,password) VALUES (:username,:password)"); 
     $params = array(
      ':username' => $username, 
      ':password' => $password 
     ); 
     $stmt->execute($params); 
    } 

} 
?> 

这是连接代码:

<?php 
    //$db_name = "xxx"; 
    //$mysql_username = "xxx"; 
    //$mysql_password = "xxx"; 
    //$server_name = "xxx"; 
    // Create connection 
    $conn = new mysqli("xxx","xxx","xxx","xxx"); 
    if ($conn->connect_error) { 
     die("Connection failed: " . $conn->connect_error); 
    } 
    echo "Connected successfully"; 

    ?> 

变化:

<?php 
require "conn.php"; 
echo "debug 1"; 
$stmt = $conn->prepare("SELECT * FROM UserData WHERE username = ?"); 
$stmt->bind_param('s', /*$_POST["username"]*/ $username); 
$username = 'hi'; 
$stmt->execute(); 
$stmt->store_result(); 

echo "debug 2"; 
if ($stmt->num_rows == 0){ // username not taken 
    echo "debug 3"; 
    $stmt2 = $conn->prepare("INSERT INTO UserData (username, password) VALUES (?, ?)"); 
    $password =(/*$_POST["password"]*/ "hey"); 
    $username =(/* $_POST["username"]*/ "hi"); 
    $stmt2->bind_param('s',$username); 
    $stmt2->bind_param('s',$password); 
    $stmt2->execute(); 
    if ($stmt2->affected_rows == 1){ 
    echo 'Insert was successful.'; 

    }else{ echo 'Insert failed.'; 
    var_dump($stmt2); 
    } 
}else{ echo 'That username exists already.';} 

?> 

这段代码获得通过所有的(1)调试,但由于某些原因,它仍然不插入。

+0

'$ mysqli'如何设置? (在'here'输出后使用) –

+0

它在conn.php文件中 –

+0

您能显示该文件的内容吗?设置用户并传递文本信息。任意的,如果需要的话。我在想'$ mysqli'应该被'$ conn'替代,但是我不知道没有更多的信息。 –

回答

0

替换该行 $result = **$mysqli->**query("SELECT * FROM UserData WHERE username ='$username' ", MYSQLI_USE_RESULT); 具有以下 $result = **$conn->**query("SELECT * FROM UserData WHERE username ='$username' ", MYSQLI_USE_RESULT);

0

和mysqli和PDO接口不得混用。这里数据库连接和SELECT查询都使用mysqli接口。但第二个INSERT查询尝试使用PDO接口,如使用指定占位符所证明的,以及将数据数组直接传递给execute()。后两个功能不受mysqli支持,因此代码在第二个查询时失败。另外请注意,第二个查询使用的是准备好的语句,而第一个则不是。再次,不应该将不同的方法混合在一起。

此外,它似乎是密码存储为纯文本,没有安全。正确的方法是使用password_hash函数。 只要确保数据库字段具有足够的宽度(比如80-120个字符或更多)来处理当前的bcrypt散列,并且允许更多的未来更改。

与mysqli的接口(与password_hash)停留,代码可以去像这样:

$stmt = $conn->prepare("SELECT * FROM UserData WHERE username = ?"); 
$stmt->bind_param('s', $_POST["username"]); 
$stmt->execute(); 
$stmt->store_result(); 
if ($stmt->num_rows == 0){ // username not taken 
    $stmt2 = $conn->prepare("INSERT INTO UserData (username, password) VALUES (?, ?)"); 
    $password = password_hash($_POST["password"], PASSWORD_DEFAULT); 
    $stmt2->bind_param('s', $_POST["username"]); 
    $stmt2->bind_param('s', $password); 
    $stmt2->execute(); 
    if ($stmt2->affected_rows == 1) 
    echo 'Insert was successful.';  
    else echo 'Insert failed.'; 
} 
else echo 'That username exists already.'; 

注意上面的方法将不适合高流量的网站,那里有一个在SELECT和INSERT数据库查询之间的短暂时间间隔内,另一个用户尝试插入相同用户名的机会条件。这将需要一种不同的方法,例如确保主题数据库字段设置为UNIQUE(无论如何,这是一个很好的做法),然后在试图重复插入时测试是否违反该UNIQUE字段。

假设数据库和INSERT权限都设置正常,但仍未插入,请尝试增强错误报告。

确保以下是在页面的顶部:

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

而第一查询之前把下面:

$driver = new mysqli_driver(); 
$driver->report_mode = MYSQLI_REPORT_ALL; 

然后再试一次。