查询为 TRUE 当它不是

Posted

技术标签:

【中文标题】查询为 TRUE 当它不是【英文标题】:Query is TRUE when its not 【发布时间】:2019-10-26 03:16:08 【问题描述】:

请对我温柔一点,我最近刚刚尝试学习 php/SQL。

问题是第一个查询在不应该时总是为真(基于我所知道的)。

查询只是声明获取用户提供的“用户名”,其中 betakey=$betakey。除了 betakey 列之外,我的数据库列仍然为空这一事实根本不会使该查询语句为真。

请帮忙,也许我缺少这方面的一些知识。

<?php
header('Access-Control-Allow-Origin: *');

$firstName = $_GET['rfirstname'];
$lastName = $_GET['rlastname'];
$username = $_GET['rusername'];
$password = $_GET['rpass'];
$betakey = $_GET['rkey'];

$host="localhost"; // Host name 
$db_username="**"; // mysql username 
$db_password="**"; // Mysql password 
$db_name="**"; // Database name 


$conn = mysqli_connect("$host", "$db_username", "$db_password","$db_name");

if (!$conn)
die ("Error: ".mysqli_connect_error());


$query1 = "SELECT username='$username' FROM users2 WHERE betakey='$betakey';";
$result_1 = mysqli_query($conn,$query1);

if(mysqli_num_rows($result_1) > 0) 

echo 'Beta key is used';

else

$query2 = "UPDATE users2 SET firstName='$firstName',lastName='$lastName',username='$username',password='$password' WHERE betakey='$betakey'";

echo 'Registration Successful';
 

mysqli_close($conn);//Close off the MySQL connection to save resources.
?>

【问题讨论】:

您的第一个查询应该只是SELECT username FROM users2 WHERE betakey='$betakey'; 除了查询中的错字;该代码是如此不安全和危险,几乎吓到我了。 您也从未执行过更新查询,因此也属于印刷错误。 @ catcon,我已经尝试过该查询,但结果仍然相同.. 稍加跟进,我尝试在 sql 中运行查询,结果是用户名列,但为空白。这算作 mysqli_num_rows 计数吗?, 【参考方案1】:

您的代码中有很多问题。让我帮你解决一些问题

你应该学习how to properly open mysqli connection。您需要启用错误报告并设置正确的字符集。

永远不要将 PHP 变量连接到 SQL 查询中。始终使用 parameterized prepared statements 而不是手动构建查询。

您的第一个 SQL 查询出错。 username='$username' 毫无意义且错误。如果您只想check existence use COUNT(1) 或类似的东西。

这是我对您的固定代码的看法:

<?php

header('Access-Control-Allow-Origin: *');

$firstName = $_GET['rfirstname'];
$lastName = $_GET['rlastname'];
$username = $_GET['rusername'];
$password = $_GET['rpass'];
$betakey = $_GET['rkey'];

$host = "localhost"; // Host name
$db_username = "**"; // Mysql username
$db_password = "**"; // Mysql password
$db_name = "**"; // Database name

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli($host, $db_username, $db_password, $db_name);
$conn->set_charset('utf8mb4');

$stmt = $conn->prepare("SELECT COUNT(username) FROM users2 WHERE betakey=?");
$stmt->bind_param('s', $_GET['rusername']);
$stmt->execute();
$result_1 = $stmt->get_result();
$used = $result_1->fetch_row()[0];

if ($used) 
    echo 'Beta key is used';
 else 
    $stmt = $conn->prepare("UPDATE users2 SET firstName=?, lastName=?, username=?, password=? WHERE betakey=?");
    $stmt->bind_param('sssss', $firstName, $lastName, $username, $password, $betakey);
    $stmt->execute();

    echo 'Registration Successful';

【讨论】:

以上是关于查询为 TRUE 当它不是的主要内容,如果未能解决你的问题,请参考以下文章

Python:有没有办法让 swipl 查询产生值 true 而不是 ?

如何将查询转换为使用正则表达式而不是相等

我可以在视图中查询数据库中的表(仅当它存在时)?

jeecg query="true" 怎么不是模糊查询

Laravel 布尔值在查询中返回“1”/“0”而不是 true/false

当@include false 或@skip true 时,是不是可以在graphql 中使用空值UUID 进行查询