mysqli连接和查询

6

我刚接触mysqli,正在学习这个教程:http://www.binpress.com/tutorial/using-php-with-mysql-the-right-way/17#comment1

我使用了以下代码连接到我的数据库:

$config = parse_ini_file('../config.ini'); 
$connection = mysqli_connect('localhost',$config['username'],$config['password'],$config['dbname']);
if($connection === false) {
die('Connection failed [' . $db->connect_error . ']');
}
echo("hello"); //this worked!

但是我尝试将其包装在一个函数中(如教程中所讨论的)... 我看到你从另一个函数调用连接函数... 在教程中,每个函数都会被另一个和另一个函数调用... 我从来没有找到初始调用从哪里开始引起函数相互调用的多米诺骨牌效应... 所以无论如何,我尝试停止它在两个函数内部只是为了测试和自学... 但它不起作用,我不知道为什么:

function db_connect() {
static $connection;

if(!isset($connection)) {
$config = parse_ini_file('../config.ini'); 
$connection = mysqli_connect('localhost',$config['username'],$config['password'],$config['dbname']);
    }
if($connection === false) {
return mysqli_connect_error(); 
}
return $connection;
echo("hello2");
}

function db_query($query) {
$connection = db_connect();
$result = mysqli_query($connection,$query);
return $result;
echo("hello1");

}

db_query("SELECT `Q1_Q`,`Q1_AnsA` FROM `Game1_RollarCoaster`"); //this didn't work :(

1
这是一个作用域问题。在您的函数中传递连接变量。 - Funk Forty Niner
今天早上我用了作用域 Ralph,但咖啡抹去了我做过的任何想法。@Fred-ii- ;-) - Jay Blanchard
1
这里有一篇关于作用域的文章,可以看看:https://dev59.com/V1vUa4cB1Zd3GeqPs10g/。与@JayBlanchard使用的不同,它不足以“应对”他的作用域。 - Funk Forty Niner
ristenk1:在那个问题和答案中往下看,有一种替代使用全局变量的方法,就是将连接变量传递到您的函数中。@JayBlanchard 愿意接手吗?我得走了。 - Funk Forty Niner
Fred - 我来试试。谢谢 :) - ristenk1
显示剩余2条评论
2个回答

4

最后,我将其从函数中删除,并使代码变得超级简单(坚持使用过程式编程而非面向对象编程,即使许多教程都使用面向对象编程 - 我认为这样做更好):

<?php 
$config = parse_ini_file('../config.ini'); 
$link = mysqli_connect('localhost',$config['username'],$config['password'],$config['dbname']);

if(mysqli_connect_errno()){  
echo mysqli_connect_error();  
}  


$query = "SELECT * FROM Game1_RollarCoaster";

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

while ($row = mysqli_fetch_array($result)) {

echo $row[Q1_Q] . '<-- Here is your question! ' . $row[Q1_AnsA] . '<-- Here is your answer! ';

echo '<br />';

}

mysqli_free_result($result);
mysqli_close($link);


?> 

2

这里有一个简单的mysqli解决方案:

$db = new mysqli('localhost','user','password','database');
$resource = $db->query('SELECT field FROM table WHERE 1');
$row = $resource->fetch_assoc();
echo "{$row['field']}";
$resource->free();
$db->close();

如果您需要获取多行数据,可以像这样操作:

$db = new mysqli('localhost','user','password','database');
$resource = $db->query('SELECT field FROM table WHERE 1');
while ( $row = $resource->fetch_assoc() ) {
    echo "{$row['field']}";
}
$resource->free();
$db->close();

有错误处理的情况:如果发生严重错误,脚本将以错误消息终止。

// ini_set('display_errors',1); // Uncomment to show errors to the end user.
if ( $db->connect_errno ) die("Database Connection Failed: ".$db->connect_error);
$db = new mysqli('localhost','user','password','database');
$resource = $db->query('SELECT field FROM table WHERE 1');
if ( !$resource ) die('Database Error: '.$db->error);
while ( $row = $resource->fetch_assoc() ) {
    echo "{$row['field']}";
}
$resource->free();
$db->close();

使用try/catch异常处理:这让你能够在一个地方处理所有的错误,并且在某些情况下,如果需要的话,可能会继续执行即使出现了错误。

try {
    if ( $db->connect_errno ) throw new Exception("Connection Failed: ".$db->connect_error);
    $db = new mysqli('localhost','user','password','database');
    $resource = $db->query('SELECT field FROM table WHERE 1');
    if ( !$resource ) throw new Exception($db->error);
    while ( $row = $resource->fetch_assoc() ) {
        echo "{$row['field']}";
    }
    $resource->free();
    $db->close();
} catch (Exception $e) {
    echo "DB Exception: ",$e->getMessage(),"\n";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接