mysql到mysqli连接代码失败了吗?

时间:2011-04-09 07:15:37

标签: php mysql mysqli

我已经看到这个code已经浮出水面,还有fixed?版本。基本上我已经开始工作了:

mysql_connect("host","client_name","client_pw");

mysql_select_db("database");

$q=mysql_query("SELECT * FROM table");

while($e=mysql_fetch_assoc($q))

$output[]=$e;

print(json_encode($output));

mysql_close();

但由于某种原因,我觉得它应该在mysqli中。我是新手,并试图编写一个等效的mysqli OO代码:

$mysqli = new mysqli("host", "client_name", "client_pw");
$mysqli->select_db("database");

$q = "SELECT * FROM table";

 while($e=$mysqli->fetch_assoc($q))
            $output[]=$e;
     print(json_encode($output));
    mysql_close();

失败了。我尝试了其他组合,例如准备查询并执行它,并将其设置为$ e,但都失败了。

我是否必须为json_encode手动构建数组?

也许更好的问题是为什么我要重新发明轮子,但这一直困扰着我。

3 个答案:

答案 0 :(得分:1)

啊,我发现你不是一个与数据库。让我们进行一次练习。

闭上眼睛,吸气,呼气。

放松。

您与数据库一个

您使用代码一个

在我之后重复。

准备。

绑定。

执行。

重复一遍。

再次

这是你的新咒语,我的朋友。

您不小心跳过了现有代码中的一个步骤。我们把它扔掉然后重新开始。

我将向您展示如何使用PDO,这是PHP与数据库通信的更好方法之一。它比mysqli扩展名更少错综复杂

// Make sure these variables contain the correct data.
    $pdo = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
// Ask PDO to throw exceptions instead of warnings.
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Here's our SQL.  We're getting back a PDOStatement object here.
    $sh = $pdo->prepare('SELECT * FROM Foo WHERE bar = ?');
// That question mark is a placeholder.  bindValue lets us replace the question mark
// with the specified data.  This is called a prepared statement.  The end result is
// *complete and total immunity* from SQL Injection, if performed correctly.
    $sh->bindValue(1, "I'm looking for a bar that is equal to this.");
// Okay, we've bound everything, let's run the query.
    $sh->execute();
// And assuming there are no errors (note my severe lack of error handling),
// we should now have our complete list of data from the database.
    print_r($sh->fetchAll(PDO::FETCH_ASSOC));

// Alternatively, we could pass bound variables as an array to execute:
    $sh = $pdo->prepare('SELECT * FROM Foo WHERE bar = ?');
    $sh->execute(array( "I'm a bar!" ));

// And of course, we can use variables in the binding...
    $bar = 746;
    $sh = $pdo->prepare('SELECT * FROM Foo WHERE bar = ?');
    $sh->bindValue(1, $bar);
    $sh->execute();

PDO对prepared statementsplaceholders的支持使成为现代PHP中数据库访问的最佳选择之一。

(mysqli也可以访问prepared statements,但它会强迫您also bind result variables,并且在很多情况下可能该死的。)

fetchAll(PDO::FETCH_ASSOC)返回一个多维数组。外部数组以数字方式编制索引,每个值都是一行。每一行都是一个字符串键控数组,其中键是列名,值是数据库中的数据。 There are a few other things that fetchAll can do,虽然我没有发现其中许多有用。您还可以fetch one row at a time

如果您愿意,您可以直接将结果传递给json_encode,并且不会遇到太多问题。

了解您需要为此代码添加适当的错误检测。为简洁起见,我在此省略了它。

答案 1 :(得分:0)

try
{

   $db = new mysqli("your_host_ip", "your_username", "your_pass", "your_db", 3306);

   if ($db->connect_errno) throw new exception(sprintf("Could not connect: %s", $db->connect_error));

   $sqlCmd = "select * from users order by username";

   $result = $db->query($sqlCmd);

   if(!$result) throw new exception(sprintf("Invalid query : %s", $sqlCmd));

   ...

答案 2 :(得分:0)

$q=mysql_query("SELECT * FROM table");

以下是使用mysqli OOP的方法 行$ q =等后 - 添加以下代码..

<?php
$result=$mysqli->query($q);
while($e=$result->fetch_assoc()){
              $output[]=$e;
}
 print(json_encode($output));
?>