无法回显查询结果--查询是否明显正确?非常简单的PHP


Cannot echo query result--query is obviously correct? Very simple PHP

所以我正在尝试创建一个HTML下拉列表。这个列表很好——它显示了我从自己的MySQL查询中想要的所有选项;然而,我的下一步是为租户设置默认值(即当前房东)。

现在,我能够成功,但只有房东的钥匙(在单独的表格中)。我有第二个查询,它根据钥匙查找房东的名字,我甚至无法得到回应。我必须假设这个查询很糟糕——但在看了整个上午相同的代码行之后,我相信我可以自信地说它不是。我希望第二双眼睛能看到我没有看到的东西。

为租户获取当前房东

$sql = mysql_query("SELECT data_txt FROM field_data WHERE itemid = $uid AND fieldid = 16");
$row = mysql_fetch_array($sql);
$ll1 = $row[0];
$sql = mysql_query("SELECT info FROM landlords WHERE key = $ll1 LIMIT 1");
$row = mysql_fetch_array($sql);
$ll1_name = $row[0]

在下拉列表中设置默认值

我不认为问题出在这里,因为我不能做任何简单的事情,比如回显变量$ll1_name;但我觉得这是值得的。

<td>
<?php echo "$ll1"; ?><br>
<?php echo "$ll1_name"; ?><br>
<select name=ll1>
<option value="<?php echo "$ll1"; ?>"> <?php echo "$ll1_name"; ?></option>
<?php
while ($curLandlord = mysql_fetch_array($landlordRows)){
?>
<option value="<?php echo "$curLandlord[0]"; ?>"> <?php echo "$curLandlord[1]"; ?></option>
<?php
}
?>

</select>
</td>

此外,我很清楚这个图书馆被贬值了,我的田地也没有被消毒,等等。我只是尽可能简单地做这件事,然后在我有了工作模式后实施。变量越少越好。

以下是表格数据的示例:

地主

密钥、信息、id(自动递增)

-*key*: ll1_07
-*info*: John Doe
-*id*: 77

field_dataid,fieldid,data_txt,itemid

-*id*: 1234 (auto increment)
-*fieldid*: 18 (each fieldid corresponds to a field name in another table.  18 is landlord)
-*data_txt*: ll1_77
-*itemid*: 33 (tenants unique ID)

不,这不是"正确的"。您存在sql注入漏洞。仅仅因为$ll1值来自数据库,并不意味着在另一个查询中重用它是安全的。你正在做相当于的事情

SELECT info FROM landlords WHERE key = foo LIMIT 1
                                       ^^^---unknown/illegal field name

而不是

SELECT info FROM landlords WHERE key = 'foo' LIMIT 1
                                       ^^^^^--string literal

如果你在查询调用中有BASIC错误处理,你会被告知这一点:

$sql = mysql_query("SELECT [..snip..]") or die(mysql_error());
                                       ^^^^^^^^^^^^^^^^^^^^^^

永远不要EVER假设查询成功。即使sql在语法上是100%正确的,它仍然失败的原因几乎是无限多的(最大的原因是缺少外键)。

试试这个,看看响应是什么:

$sql = "
    SELECT
        fd.data_text,
        l.info
    FROM
        field_data fd
    JOIN
        landlords l
        ON fd.data_text = l.key
    WHERE
        fd.itemid = $uid
        AND fd.fieldid = 16
    LIMIT 1";
$rs = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_array($rs);
var_dump($row);

这应该会告诉你是否正在获取任何数据。