2017-07-15 80 views
0

我在我的项目中拥有一切权利。但我不能在屏幕打印此查询SQL查询的打印结果

$sql = "SELECT * FROM appointment WHERE prof_id=(SELECT user_id FROM user WHERE lastname='$prof_last') AND student_id=(SELECT user_id FROM user WHERE username={$_SESSION['username']});"; 
$result = mysqli_query($conn, $sql); 
$row = mysqli_fetch_assoc($result); 
echo "<div>$row</div>" ; 

具体的restults它表明我这个错误:mysqli_fetch_assoc()预计参数1被mysqli_result,布尔给

我搜索无处不在,但不明白什么即时通讯做错

+0

皮特的缘故看手册[PHP Mysqli Fetch Assoc](http://php.net/manual/en/mysqli-result.fetch-assoc.php) – RiggsFolly

+0

我有..但我实际上不能理解 – kon

+0

您的查询中可能有错误,因此$ result是错误的。检查您的查询 –

回答

0

mysqli_fetch_assoc返回读取的每行的阵列,以便$row是一个数组

的列的名称将被作为键中的值从DAT取凌辱。

因此,作为一个例子,如果你做了一个

SELECT a,b,c FROM table 

你会做这样的事情,以显示数据

$result = mysqli_query($conn, $sql); 
// check for errors 
// you do have errors so please add this test 
if (!$result) { 
    echo $conn->error; 
    exit; 
} 

while ($row = mysqli_fetch_assoc($result)) { 
    echo "<div>{$row['a']}</div>" ; 
} 

现在,您需要在回声中使用真实的列名line

恐怕我应该提一下你的脚本有风险SQL Injection Attack 有看看发生了什么事Little Bobby Tables即使 if you are escaping inputs, its not safe! 使用prepared parameterized statements

+0

实际上做到了。谢谢。但是我的预约表有2个id columns和2个datetime ..所以如果我想显示两个日期时间,而不是id这个acutal名称,我应该怎么做? – kon

+0

您必须提出另一个问题,因为这与此问题有很大不同。在这个新问题中,请向我们展示涉及表的模式 – RiggsFolly

0

你最有可能需要更改代码。

除非$_SESSION['username']已经由单引号包围,你应该写

$sql = "SELECT * FROM appointment " . 
     "WHERE prof_id=(SELECT user_id FROM user WHERE lastname='$prof_last') " . 
     " AND student_id=(SELECT user_id FROM user WHERE username='{$_SESSION['username']}');"; 

$result = mysqli_query($conn, $sql); 
if ($result) 
{ 
    $row = mysqli_fetch_assoc($result); 
    echo "<div>$row</div>" ; 
} 
else 
{ 
    // perform error checking as adequate 
} 

...或者更好的是:

$sql = "SELECT * " . 
     "FROM appointment a " . 
     "  JOIN user prof ON prof.user_id = a.prof_id " . 
     "  JOIN user stud ON stud.user_id = a.student_id " . 
     "WHERE " . 
     "  prof.lastname = '$prof_last' " . 
     "  AND stud.username = '{$_SESSION['username']}'; " ; 

注意:这仅仅是安全的,如果$prof_last{$_SESSION['username']}已经正确消毒。使用预准备语句和绑定参数总是更好。

+0

[SQL注入攻击](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) – RiggsFolly

+1

@RiggsFolly:除非$ prof_last和$ _SESSION ['username']'已经正确转义。我们不知道他们是否是否是。如果我要编程,我会使用'?'然后绑定参数。无论如何,请参阅答案上的最后一个注释;它与你保持一致。 – joanolo

+0

即使 [如果你是逃避投入,它不安全!](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) 使用[准备参数化语句](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) – RiggsFolly