【问题标题】:Cannot query MySQL database via PHP无法通过 PHP 查询 MySQL 数据库
【发布时间】:2015-12-11 16:23:45
【问题描述】:

在我的 PHP 代码中,我很容易将记录写入我的数据库,但由于某种原因,我无法读取任何内容。我的 PHP 代码是:

$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT * FROM companies";

if ($conn->query($sql) === TRUE)
{
    echo "query success";

    while($row = $result->fetch_assoc())
    {
        echo "ID: " . $row["ID"]. " - Name: " . $row["name"]. "<br>";
    }
}
else
{
    echo "query failure";
    echo "Error: " . $sql . "<br>" . $conn->error;
}


$sql = "INSERT INTO companies (name) 
        VALUES ('mycompany')";

if ($conn->query($sql) === TRUE)
{

    echo "insert success";
}
else
{
    echo "insert failure";
    echo "Error: " . $sql . "<br>" . $conn->error;
}

当我运行它时,我从浏览器得到的输出是: query failureError: SELECT * FROM companies insert success

我尝试了 $sql 字符串中的撇号、插入符号、引号的变体。我试过在 HeidiSQL 中运行这个查询,它工作正常。有什么想法我哪里出错了吗?有什么更基本的建议,我可以尝试缩小问题的根源?

谢谢!

【问题讨论】:

  • 您实际上并没有绑定查询的结果,if ($result = $conn-&gt;query($sql))。但这不是问题的根源,请查看 mysqli_errorerror_reporting(-1);
  • 您应该考虑使用一个条件,以便选择运行,或者插入运行,或者插入在选择之后运行,或者选择在插入之后运行。现在,您的代码正在重用同一个变量,而没有对该变量何时被赋予新值进行任何控制。

标签: php mysql


【解决方案1】:

mysqli-&gt;query()SELECT 语句一起使用会返回mysqli_result 的实例。它与 true (=== true) 不同,但也不代表错误。

此外,$result 未定义。

改用这个:

$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT * FROM companies";

if (($result = $conn->query($sql)) !== FALSE)
{
    echo "query success";

    while($row = $result->fetch_assoc())
    {
        echo "ID: " . $row["ID"]. " - Name: " . $row["name"]. "<br>";
    }
}
else
{
    echo "query failure";
    echo "Error: " . $sql . "<br>" . $conn->error;
}
...

这只是将您的=== TRUE 支票更改为!== FALSEMySQLi::query() 在失败时返回布尔值 FALSE,在没有结果集的成功查询时返回布尔值 TRUE,在有结果集时返回 mysqli_result。 这也将 query() 的结果分配给$result

【讨论】:

  • 看起来 OP 没有说再见就起飞了,也没有留下漂亮的小费 ;-)
  • 每个人都很好。我会说我收到的所有信息都有助于解决这个问题。其实我在想也许我应该这样做来测试查询结果$result = $conn-&gt;query($sql); if ($result-&gt;num_rows &gt; 0)有人同意吗?
  • @mitch 是的,这会更有意义 Mitch,但是它可能会失败(在某些时候),你需要使用 WHERE 子句(它可以更好地工作)>>> 取决于您真正想要在这里实现的目标。你可以在查询错误时使用mysqli_error($conn),或者混合使用。
  • @mitch 可能会导致 Trying to get property of non-object,因为如果查询失败,$result === false
  • 谢谢。我现在检查if($result !== FALSE),然后检查$result-&gt;num_rows。看起来不错?
【解决方案2】:

您尚未将查询结果分配给$result 变量。

    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 

    $sql = "SELECT * FROM companies";
    $result = $conn->query($sql);
    if ($result === TRUE)
    {
        echo "query success";

        while($row = $result->fetch_assoc())
        {
            echo "ID: " . $row["ID"]. " - Name: " . $row["name"]. "<br>";
        }
    }
    else
    {
        echo "query failure";
        echo "Error: " . $sql . "<br>" . $conn->error;
    }


    $sql = "INSERT INTO companies (name) 
            VALUES ('mycompany')";

    if ($conn->query($sql) === TRUE)
    {

        echo "insert success";
    }
    else
    {
        echo "insert failure";
        echo "Error: " . $sql . "<br>" . $conn->error;
    }

【讨论】:

    【解决方案3】:

    问题是 SELECT 查询将在 SUCCESS 上返回一个 mysqli_result 对象,而不是布尔值 TRUE。只有查询失败,才会返回布尔值 FALSE;

    因此你应该这样使用它:

    $result = $conn->query($sql);
    
    if ($result !== FALSE){
        while($row = $result->fetch_assoc())
        {
            echo "ID: " . $row["ID"]. " - Name: " . $row["name"]. "<br>";
        }
    }
    

    【讨论】:

      【解决方案4】:

      只需更改您的 if 条件:-

      if ($result = $conn->query($sql))
      {
          echo "query success";
      
          while($row = $result->fetch_assoc())
          {
              echo "ID: " . $row["id"]. " - Name: " . $row["name"]. "<br>";
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-12-29
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-18
        • 1970-01-01
        • 2011-12-02
        • 1970-01-01
        相关资源
        最近更新 更多