【问题标题】:Is there any errors with this PHP Code?此 PHP 代码有任何错误吗?
【发布时间】:2011-07-14 18:27:31
【问题描述】:

由于我没有返回任何输出,这有什么问题吗?提前谢谢。

$question_text = $_POST['question_text'];

$first_word = explode(" ", $question_text);

$query ="SELECT c.field_name,t.category_name, d.domain_name FROM category_fields c, taxonomy_category t,  taxonomy_domain d
 WHERE c.category_Id = t.category_Id AND t.domain_Id = d.domain_Id
 AND c.field_name = '$first_word'";

我已经把我的代码改成了这个,但仍然没有输出。我显示它们的方式有问题吗?谢谢

$question_text = $_POST['question_text'];

list($first_word) = explode(' ', $question_text);

$query ="SELECT c.field_name,t.category_name, d.domain_name FROM category_fields c, taxonomy_category t, taxonomy_domain d WHERE c.category_Id = t.category_Id AND t.domain_Id = d.domain_Id AND c.field_name = ' ".mysql_escape_string($first_word[0])."'";

$result = mysql_query($query);

while($row = mysql_fetch_array($result, MYSQL_ASSOC))

{

echo "关键字:{$row['c.field_name']}" 。 “类别:{$row['t.category_name']}”。 “域名:{$row['d.domain_name']}”; }

?>

【问题讨论】:

  • 此代码易受SQL injection attack 的攻击。请不要将 POST 数据直接插入到查询中——做一些转义。您可以尝试检查 $first_word 的值是什么并针对您的数据库手动运行查询。
  • print_r 是你的朋友。 print_r($first_word); 将指出它为什么不工作。此外,list($first_word) = explode(' ', $question_text); 将生成的数组的第一个元素提取到$first_word

标签: php mysql sql


【解决方案1】:

$first_word 是一个数组,而不是一个字符串,在你的查询中你想要 $first_word[0]

将任何用户提交的值直接放入 sql 查询也是非常不安全的,应该始终对其进行清理。

【讨论】:

  • 谢谢,所以我只需要将数组添加到 $first_word 吗?也查询?谢谢:)
【解决方案2】:

您可以使用以下代码代替 explode 行来获取正确的 SQL 查询:

$first_word = mysql_real_escape_string(strtok($question_text, " "));

strtok 将字符串剪切到第一个空格。并且转义函数是防止您的脚本受到 SQL 攻击所必需的。

【讨论】:

    【解决方案3】:

    $first_word = explode(" ", $question_text); $first_word 是一个数组,因为 explode 返回和数组

    因此

    $query ="SELECT c.field_name,t.category_name, d.domain_name FROM category_fields c, taxonomy_category t,  taxonomy_domain d
     WHERE c.category_Id = t.category_Id AND t.domain_Id = d.domain_Id
     AND c.field_name = '$first_word'";
    

    应该是

    $query ="SELECT c.field_name,t.category_name, d.domain_name FROM category_fields c, taxonomy_category t,  taxonomy_domain d
     WHERE c.category_Id = t.category_Id AND t.domain_Id = d.domain_Id
     AND c.field_name = '".mysql_escape_string($first_word[0])."'";
    

    阅读http://php.net/manual/en/function.mysql-escape-string.php 了解mysql_escape_string 的作用。

    【讨论】:

    • 嗨,谢谢,我已经修复了代码,但仍然没有输出。有什么问题吗?上面添加了新代码。
    【解决方案4】:
    list($first_word) = explode(' ', $question_text);
    

    这应该可以解决问题。 清理您的数据库输入!

    【讨论】:

    • 嗨,谢谢,我已经修复了代码,但仍然没有输出。有什么问题吗?上面添加了新代码。 ——
    • 艾比;当您执行list($first_word) = explode(' ', $question_text); 时,您不再将$first_word 作为数组访问。 list() 函数从explode() 的数组结果中提取第一个元素,并将其存储在提供的参数中,在本例中为$first_word。您可以在查询中简单地使用$first_word清理您的数据库输入!
    • 好的,我会看看清理输入的方法,因为我是 PHP 的初学者 :) 但是一个快速的问题,我是否必须有一个表格来存储方法 POST 中的 question_text我用的那个?目前,我有一个名为关键字的数据库,其中包含 3 个表(category_fields、taxonomy_category、taxonomy_domain)。我已将其设为列表($first_word)并仅查询 $first_word 但我仍在获取关键字:类别:域:它没有显示 1 i'已在查询中说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多