我已经看到这个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手动构建数组?
也许更好的问题是为什么我要重新发明轮子,但这一直困扰着我。
答案 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 statements和placeholders的支持使成为现代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));
?>