2017-10-17 75 views
0

我有一个MySQL语句不适合我。我已经检查了代码的几个部分,但它作为结果保持返回null。我也试过替换WHERE enc_mail = AND enc_public_id=" to "WHERE 1"来检查它是否是变量的问题,但事实并非如此。我也没有得到任何错误。我的MySQL准备好的语句将不起作用

$connect_db = mysqli_connect("myhost","my username","my password","my db"); 

    $mail_id = crypto(mysqli_real_escape_string($connect_db,htmlspecialchars($_GET['em'])),'e'); 
    $public_id = mysqli_real_escape_string($connect_db,htmlspecialchars($_GET['public'])); 
    $active_true = true; 
    $check = $connect_db->prepare("SELECT active FROM enc_data WHERE enc_mail=? AND enc_pub_id=?"); 
    $check->bind_param("ss", $mail_id, $public_id); 
    $active = $check->execute(); 

     if($active[0]==""){ 
     //It goes here once the code is run 
    } 
+0

我没有看到你在这里检查错误。 – Akintunde007

+1

绝对没有理由同时使用'real_escape_string()'** _和_ **参数化变量。参数化的变量对自己来说已经足够了:)也包括其他任何字符串清理,如果使用参数化变量,则没有必要。摆脱所有这些肯定会有助于您的代码的可读性。 – GrumpyCrouton

+0

@garethpower请添加错误记录部分,以便我们看到如何检查错误 – Progman

回答

1

您需要申请bind_result然后fetch

而且也绝对没有理由escape_string使用预处理语句作为@GrumpyCrouton说

的时候我会建议您切换到PDO,因为它是更直截了当

+0

是的。我刚刚学到了一些新东西。谢谢:) – Akintunde007

+1

嘿,如果你是PDO的粉丝,你应该看看[我写的班级](https://github.com/GrumpyCrouton/GrumpyPDO),让我知道如果你看到任何我可以做得更好的东西 – GrumpyCrouton

+0

1)正如它在文档中提到的:http://www.php.net/manual/en/mysqli-stmt.fetp.php 2)通常首先修改/ crypt /一个字符串的东西,然后/最后转义它,除了当使用它作为准备语句的参数 3)+1为PDO :-) – clemens321

1

我同意@Akintunde,你不应该使用查询参数的转义和htmlspecialchars。当您使用查询参数时,转义是多余的。 htmlspecialchars只是当你输出内容到HTML,而不是输入到SQL。

对于mysqli查询,您不一定必须使用bind_result()。您可以从预准备语句中获取结果对象,然后在结果对象上使用获取方法来获取连续的行。

这是我会怎么写代码:

// makes mysqli throw exceptions if errors occur 
mysqli_report(MYSQLI_REPORT_STRICT); 

$connect_db = new mysqli("myhost", "my username", "my password", "my db"); 

$mail_id = $_GET['em']; 
$public_id = $_GET['public']; 
$active_true = true; 
$sql = "SELECT active FROM enc_data WHERE enc_mail=? AND enc_pub_id=?"; 
$stmt = $connect_db->prepare($sql); 
$stmt->bind_param("ss", $mail_id, $public_id); 
$stmt->execute(); 
$result = $stmt->get_result(); 
while ($row = $result->fetch_assoc()) { 
    if($row["active"]==""){ 
     //It goes here once the code is run 
    } 
} 

但其实我更愿意使用替代的mysqli PDO,所以我想这不是真的我怎么会写OP代码。 :-)

+0

应该指出,get_result不保证是可用的,这可能会产生问题 –

+0

@YourCommonSense,据我所知'get_result()'需要** mysqlnd **驱动程序,然后才可用。是否有其他原因不可用? –

+0

是的,这就是原因。 –