2014-07-15 19 views
-1
<?php 
$link = mysqli_connect('localhost','root','root'); 
$link->query('CREATE DATABASE IF NOT EXISTS users'); 
$link->Select_db('users'); 

$sql='SELECT id FROM users WHERE email = '.$useremail.' AND username = '.$username; 
$results = $link->query($sql); 
$numrows = $results->num_rows; 

if ($numrows == 1) { 
    #update user information 
} else { 
    #failed to update 
} 
?> 

它只适用于部分时间,我无法从这种或那种方式找出错误。我可以确认错误在$ numrows = $ results-> num_rows中弹出;行,但至于为什么,我迷路了。偶尔它会按预期工作,所以任何和所有的建议,我可以做些什么来解决它,或者至少帮助我更好地理解它是非常感谢。谢谢!我的num_rows在哪里失败?

回答

1

使用双引号查询和varchar /字符串传递用单引号

$sql="SELECT id FROM users WHERE email = '".$useremail."' AND username = '".$username."'"; 
$results = $link->query($sql); 
$numrows = $results->num_rows(); 
+0

这也经过测试,并没有任何明显的问题通过。在原来的代码中,我们确实使用了'“。$ var ...等等。问题在于num_rows失败。在它引发致命错误之后放置一个开放/关闭括号115.虽然我很欣赏输入,你的建议并没有改善num_rows的情况,抱歉。 – user3757125

0

,你对num_rows呼叫产生的错误是,你的查询有一个错误,并且query()返回,而不是原因一个有效的结果资源。因为尝试以错误值调用方法是致命错误,所以在使用它之前,应始终检查返回值query()。例如:

if (!($result = $link->query($sql))) { 
    die($link->error); 
} 

问题与您的查询:

  • 您创建一个名为users数据库并默认数据库,然后运行从名为users SELECT查询。您刚刚创建的数据库中不会有表格。在SQL中,我们对表而不是数据库使用SELECT(这是两种不同的东西,类似于文件系统目录中包含的文件)。

  • 您不会在您的SQL语句中引用字符串参数。例如,该SQL将是一个错误:

    SELECT id FROM users WHERE email = [email protected] AND username = bill 
    

    它应该是这个:

    SELECT id FROM users WHERE email = '[email protected]' AND username = 'bill' 
    

    我知道行情会比较混乱,因为你有PHP字符串引号,然后SQL字符串引号,但这里是完成它的几种方法:

    $sql='SELECT id FROM users WHERE email = \''.$useremail.'\' AND username = \''.$username.'\''; 
    $sql="SELECT id FROM users WHERE email = '".$useremail."' AND username = '".$username."'"; 
    $sql="SELECT id FROM users WHERE email = '{$useremail}' AND username = '{$username}'"; 
    
  • 我不知道你是否有适当的保护你的PHP变量。您必须从不将PHP变量内插到SQL字符串中,除非您已经转义了变量的内容。

    $useremail_esc = $link->real_escape_string($useremail); 
    $username_esc = $link->real_escape_string($username); 
    $sql="SELECT id FROM users WHERE email = '{$useremail_esc}' AND username = '{$username_esc}'"; 
    
  • 但它会更好地使用与参数占位符的预处理语句。这比转义变量更容易使用,并且更可靠。这里有一个例子:

    $sql="SELECT id FROM users WHERE email = ? AND username = ?"; 
    $stmt = $link->prepare($sql); 
    $stmt->bind_param("ss", $useremail, $username); 
    $stmt->execute(); 
    $result = $stmt->get_result(); 
    

    请注意,您在使用参数,你不把周围的?占位符SQL报价不使用逃逸。

+0

从那里,我只使用$ result-> num_rows? (对于引语感到抱歉,我从记忆中输入了这些信息,并且有些细节往往会滑落,所涉及的数据库完全充实,并且条目已存在,但无论返回的是0还是0.) – user3757125

+0

对不起,我这仍然有一些麻烦。 $ stmt-> get_resut()返回一个未定义函数的错误。 – user3757125

+0

'get_result()'函数仅在您有mysqlnd时可用,默认情况下应该在PHP 5.4.0及更高版本中启用。请参阅http://us1.php.net/manual/en/mysqlnd.install.php –

相关问题