PHP选择不工作

PHP选择不工作,php,mysql,Php,Mysql,我正试图让一个用户通过验证。更新代码: $username="------"; $password="------"; $database="------"; $host = "------"; mysql_connect($host,$username,$password); mysql_select_db($database) or die( "Unable to select database"); $username = $_POST['username']; $password

我正试图让一个用户通过验证。更新代码:

$username="------";
$password="------";
$database="------";
$host = "------";


mysql_connect($host,$username,$password);
mysql_select_db($database) or die( "Unable to select database");

$username = $_POST['username'];
$password = $_POST['password'];

echo 'username: ' . $username . '<br>';  //myname
echo 'password: ' . $password . '<br>';  //mypass

function checkpass()
{
    //$result = mysql_query("SELECT * FROM REG_USERS where USERNAME='$_POST[username]' and PASSWORD='$_POST[password]' ") or die(mysql_error());  
    $result = mysql_query("SELECT * FROM REG_USERS where USERNAME='" . $username . "' and PASSWORD='" . $password . "'") or die(mysql_error());  
    return  mysql_num_rows($result);
}

checkpass();
echo 'checkpass:'. checkpass();
$username=“----”;
$password=“----”;
$database=“----”;
$host=“----”;
mysql\u connect($host、$username、$password);
mysql_select_db($database)或die(“无法选择数据库”);
$username=$_POST['username'];
$password=$_POST['password'];
回显“用户名:”$用户名。”
'//我的名字 回显“密码:”$密码。”
'//我的通行证 函数checkpass() { //$result=mysql\u query(“从REG\u用户中选择*,其中USERNAME='$\u POST[USERNAME]”和PASSWORD='$\u POST[PASSWORD]”)或die(mysql\u error()); $result=mysql\u query(“从REG\u用户中选择*,其中USERNAME='”、“$USERNAME.”和PASSWORD='”、“$PASSWORD.”)或die(mysql\u error()); 返回mysql\u num\u行($result); } checkpass(); 回显“checkpass:”。checkpass();

在第一个查询中,checkpass返回1。在第二个函数中,它返回0。为什么?

这里有一个使用mysqli的解决方案:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$city = "Amersfoort";

/* create a prepared statement */
if ($stmt = mysqli_prepare($link, "SELECT USERNAME FROM REG_USERS WHERE USERNAME = ? AND PASSWORD = ?")) {

    /* bind parameters for markers */
    mysqli_stmt_bind_param($stmt, "ss", $_POST[username], $_POST[password]);

    /* execute query */
    mysqli_stmt_execute($stmt);

    /* bind result variables */
    mysqli_stmt_bind_result($stmt, $USERNAME);

    /* fetch value */
    mysqli_stmt_fetch($stmt);

    echo "The username is $USERNAME";

    /* close statement */
    mysqli_stmt_close($stmt);
}

/* close connection */
mysqli_close($link);

让我们先把mysql接口的问题放在一边(以后不太好用),还有一个事实,您真的不想将任何类型的受用户影响的变量直接放入sql字符串中[sql injection!!!!],您在描述中说:

$result=mysql\u查询(“从注册用户中选择*”
用户名=“$USERNAME.”和密码=“$PASSWORD.”)或死亡(mysql_error())

不起作用

为什么会这样
$username
$password
设置为空。在第一个示例中,您首先将它们设置为某个值,但随后不使用它们(而是使用直接的
$\u POST
变量)

在第二个示例中,您没有设置它们

下面的工作也是如此(注意,这里不需要将变量连接到字符串中)


同样,请确保您从未在实际代码中执行此操作(只是将变量直接放入SQL字符串中)。使用预先准备好的语句。

好了,现在我们有了完整的代码,这是显而易见的

$username
$password
不是全局的。函数不知道它们设置为什么

$username = $_POST['username'];
$password = $_POST['password'];

echo 'username: ' . $username . '<br>';  //myname
echo 'password: ' . $password . '<br>';  //mypass

function checkpass()
{
    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string($_POST['password']);

    //$result = mysql_query("SELECT * FROM REG_USERS where USERNAME='$_POST[username]' and PASSWORD='$_POST[password]' ") or die(mysql_error());  
    $result = mysql_query("SELECT * FROM REG_USERS where USERNAME='" . $username . "' and PASSWORD='" . $password . "'") or die(mysql_error());  
    return  mysql_num_rows($result);
}
$username=$\u POST['username'];
$password=$_POST['password'];
回显“用户名:”$用户名。”
'//我的名字 回显“密码:”$密码。”
'//我的通行证 函数checkpass() { $username=mysql\u real\u escape\u字符串($\u POST['username']); $password=mysql\u real\u escape\u字符串($\u POST['password']); //$result=mysql\u query(“从REG\u用户中选择*,其中USERNAME='$\u POST[USERNAME]”和PASSWORD='$\u POST[PASSWORD]”)或die(mysql\u error()); $result=mysql\u query(“从REG\u用户中选择*,其中USERNAME='”、“$USERNAME.”和PASSWORD='”、“$PASSWORD.”)或die(mysql\u error()); 返回mysql\u num\u行($result); }


NB我知道mysqli。OP不是在问这个问题,我也不是很在意这个问题,但我添加了mysql\u real\u escape\u字符串,这是一个很好的措施。

作为一个提示,请确保您总是转义用户输入。但不要转义最重要的addslashes?您是否考虑过启用
错误报告(E\u all)当某些东西不起作用时?人们能不能别再纠结于告诉任何在其中发布带有mysql的代码的人,他们必须立即使用mysqli。不用着急。这就是为什么一开始就不应该回答过于本地化的问题。OP只是不理解变量的作用域,拒绝显示实际代码,或者读取明显的错误消息。个人调试会话,对未来的用户没有用处。我不认为这些示例是孤立的,因此没有设置这些变量,但我要求提供完整的代码,只是为了检查。还没有回应,很好。谢谢。我在评论中遗漏了这一点。当然,这些例子并不是孤立的,所以这个答案是毫无意义的。好吧,但如果你在问题中改进了这一点,那就很明显了。为什么要否决这个呢@njk提供了一个很好的例子来说明如何正确操作。我可以想象,因为它实际上并没有回答这个问题。@DWright只需单击一次就可以留下评论。这就是亚马逊如此上瘾的原因。很高兴看到芝加哥地区的另一个人。我懂了。但是如果用户遵循erdomester遵循njk的示例,那么无论问题是什么,erdomester都会有一些漂亮、正确的代码。i、 在任何情况下,njk erodmester都会发现这个问题已经得到了回答。我的错。但他们永远不会明白到底是什么错了,它也没有回答为什么它不起作用的问题。这是一个多么愚蠢的错误啊。谢谢你,你不担心吗?这是否意味着你不反对使用它?首先考虑到代码,我们所有人都会发现它。我可以指出mario对使用
错误报告(E_all)的评论吗-PHP会告诉您这些变量没有设置。
$username = $_POST['username'];
$password = $_POST['password'];

echo 'username: ' . $username . '<br>';  //myname
echo 'password: ' . $password . '<br>';  //mypass

function checkpass()
{
    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string($_POST['password']);

    //$result = mysql_query("SELECT * FROM REG_USERS where USERNAME='$_POST[username]' and PASSWORD='$_POST[password]' ") or die(mysql_error());  
    $result = mysql_query("SELECT * FROM REG_USERS where USERNAME='" . $username . "' and PASSWORD='" . $password . "'") or die(mysql_error());  
    return  mysql_num_rows($result);
}