【问题标题】:string(49) "select * from php mysql errorstring(49) "select * from php mysql error
【发布时间】:2016-07-31 16:17:26
【问题描述】:

我正在制作一个用于显示数据库中数据的网页。数据库存储在MySQL 中,我正在PHP 中制作网页。我拥有的PHP 代码是

<form action="list_projects.php" method="post">
    <p>Choose Search Type: <br /></p>
    <select name="searchtype">
        <option value="partNo">Part Number</option>
        <option value="pname">Part Name</option>
        <option value="color">Part Colour</option>
        <option value="weight">Part Weight</option>
        <option value="city">City</option>
    </select>
    <br />
    <p>Enter Search Term: </p>
    <br />
    <input name="searchterm" type="text" size="20"/>
    <br />
    <input type="submit" name="submit" value="Search"/>
</form>

<?php
    $searchtype=$_POST['searchtype'];
    $searchterm=trim($_POST['searchterm']);
    if (!$searchtype || !$searchterm) {
        echo 'No search details. Go back and try again.';
        exit;
    }

    $query = "select * from project where ".$searchtype." like '%".$searchterm."%'";
    var_dump($query);

    $result = mysqli_query($link,$query);
    $num_results = mysqli_num_rows($result);

    echo "<p>Number of projects found: ".$num_results."</p>";
    for ($i=0; $i <$num_results; $i++) {
        $row = mysqli_fetch_assoc($result);
        echo "<p><strong>".($i+1).". Part Number: ";
        echo htmlspecialchars(stripslashes($row['partNo']));
        echo "</strong><br />Part Name: ";
        echo stripslashes($row['pname']);
        echo "<br />Part Colour: ";
        echo stripslashes($row['color']);
        echo "<br />Part Weight: ";
        echo stripslashes($row['weight']);
        echo "<br />City";
        echo stripcslashes($row['city']);
        echo "</p>";
    }
    mysqli_free_result($result);
    mysqli_close($link);
?>

但是当我运行它时,我得到string(49) "select * from project where projectNo like '%J1%'" Number of projects found: 这个PHP 脚本用于加载数据库中的不同项目,并且在调用此脚本的welcome.php 脚本中连接到数据库并且它确实连接到它正确。

【问题讨论】:

  • 如果你直接运行查询select * from project where projectNo like '%J1%',你会得到任何结果吗?
  • 删除var_dump($query);,它被连接到echo "&lt;p&gt;Number of projects found: ".$num_results."&lt;/p&gt;"; 然后它运行吗
  • @RiggsFolly 它已经消除了错误,但它不会显示数据库中的任何内容
  • 在将 $_POST 值插入 SQL 查询之前,对它们运行 mysqli_real_escape_string 也是一个非常好的主意。否则,任何带有 ' 或某些其他字符的搜索词都会搞砸您的数据库。

标签: php mysql


【解决方案1】:

看起来您 var 转储了错误的变量。你可以试试这个:

$query = "SELECT * FROM project WHERE ".$searchtype." LIKE '%".$searchterm."%'";

$result = mysqli_query($link,$query) or die("Line ".__LINE__." Error found: ".mysqli_error($link)); // If there's an error, it should show here.

【讨论】:

  • 我做了一个小的编辑,以进一步说明输出时的错误详细信息,显示错误出现在哪一行。
  • 是的,如果我们确定行号会准确得多。好东西! :)
  • 显示它在第 28 行。$result = mysqli_query($link,$query) or die("Line ".__LINE__." Error found: ".mysqli_error($link)); 的行
  • 输入前请三思;我们刚刚告诉您输入错误,并且您已经向我们展示了我们告诉您写的行,因此您无需重复给我们!请告诉我们错误声明的实际内容!!! @史密斯。编辑您的问题并在底部插入错误消息。干杯
  • @Martin 我已经将该行复制到我的代码中,但它只是说行号并没有给出任何错误,它只是说Line 28 Error found:
【解决方案2】:

因为它很痛苦,所以我想重写你的代码并向你展示你应该如何这样做:

请注意,页面顶部是对包含文件的引用,您可以在其中设置数据库变量 ($link)。

<?php
//include "../../reference/to/mysql/login.php";
/***
 * The below code block should be in your include file referenced above 
 ***/
$link = mysqli_connect("localhost", "my_user", "my_password", "my_db");
if (!$link) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}
/***
 * End connection block
 ***/

/***
 * Your data is POSTed so it can not be trusted and must at the
 * very least be escaped using the below functions.
 ***/
$searchtype=mysqli_real_escape_String($link,$_POST['searchtype']);
$searchterm=mysqli_real_escape_String($link,$_POST['searchterm']);
$searchterm=trim($searchterm);
/***
 * Because your $searchtype is a column reference you need to ensure
 * it fits the allowed characters criteria for MySQL columns
 ***/
$searchtype = preg_replace("/[a-z0-9_]/i","",$searchtype);

请阅读MySQL manual about the allowed characters 以在列名中使用。 $ 也是允许的,但我将其从此处删除,因为您确实不应该将该符号用作列名字符。

if (!$searchtype || !$searchterm) {
    echo 'No search details. Go back and try again.';
    exit;
}

$query = "select * FROM project WHERE ".$searchtype." LIKE '%".$searchterm."%'";
$result = mysqli_query($link,$query)  or die("Line ".__LINE__." Error: ".mysqli_error($link));
$num_results = mysqli_num_rows($result);

echo "<p>Number of projects found: ".$num_results."</p>";
$i = 0;
while ($row = mysqli_fetch_array($result)) {
    $i++;
    echo "<p><strong>".$i.". Part Number: ";
    echo htmlspecialchars($row['partNo']);
    echo "</strong><br />Part Name: ";
    echo htmlspecialchars($row['pname']);
    echo "<br />Part Colour: ";
    echo htmlspecialchars($row['color']);
    echo "<br />Part Weight: ";
    echo htmlspecialchars($row['weight']);
    echo "<br />City ";
    echo htmlspecialchars($row['city']);
    echo "</p>";
}
?>

希望您可以在这里看到,我已将您的 for 循环替换为 while 循环,该循环执行相同的操作,一次从数据库中取出每一行,并将其作为具有标识符 $row 的数组输出.

我也使用了mysqli_fetch_array 而不是你的 fetch_assoc。

我已更正了您的 stripslashes 函数中的拼写错误,但也将 stripslashes 替换为 htmlspecialchars,因为 stripslashes 是一个古老且几乎无用的叛徒函数,即使是远程现代数据库接口也不应该使用

你的问题也是这里编码的这个页面没有为它声明$link,$link标识符需要在每个想要连接到数据库的页面的顶部设置。您需要记住,PHP 不会跨页面记住标准变量,因此仅仅因为您在 welcome.php 中设置了 $link 并不意味着它在此页面中是已知的。

  • 使用附加到查询末尾的or die (mysqli_error($link)); 向您反馈发生的错误。
  • 必须养成使用PHP Error Reporting 的习惯,以便在解决自己的问题方面取得任何进展。
  • $link 通常设置在 PHP include file 中,您只需在需要它的每个 PHP 页面的顶部调用它。
  • 如果需要,details about how to connect to MySQLi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2014-06-17
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多