1

我似乎无法理解如何使用 PHP/MySQLi 正确使用 MySQL 数据库中的信息的概念。据我了解,您生成一个表示连接对象的变量:

$connectionObject = mysqli_connect('serverString', 'userString', 'passString', 'databaseString');

然后,生成一个表示您要使用的查询字符串的变量:

$queryString = "SELECT rowName FROM tableName";

然后,生成一个表示从成功查询返回的结果对象的变量:

$resultObject = mysqli_query($connectionObject, $queryString);

然后,您使用 fetch_assoc() 函数从结果对象生成一个数组并将其分配给一个变量:

$resultArray = myqli_fetch_assoc($resultObject);

然后,您可以使用 while 循环(我对此有问题)对数组进行排序并以某种方式使用该行的内容:

while ($resultArray) {
echo $resultArray["rowName"];
}

不知何故,我是否以错误的方式理解了这个概念,因为它对我不起作用,甚至输出基于文本的 CHAR(10) 字段的文本内容,其内容不超过:“BLAH”。

无论如何,循环遍历数组以最终按名称挑选数组项对我来说似乎没有意义,但无论我在哪里看,我都会找到相同的概念。

我的脚本代码,减去一些关键细节,是:

if ($connectionObject=mysqli_connect("host0", "username0", "password0", "mysqldatabase0")) {
echo "Con";
}

if ($queryString="SELECT 'testdata' FROM 'testtable'") {
echo "Query";
}

if ($resultObject=mysqli_query($connectionObject, $queryString)) {
echo "Result";
}

if ($resultArray=mysqli_fetch_assoc($resultObject)) {
echo "Array";
}

while ($row=$resultArray) {
echo $row["testdata"];
print_r ($row);
}
4

2 回答 2

0

mysqli_fetch_assoc返回一个关联的字符串数组,表示结果集中获取的行,即您的$resultObject.

问题是你在哪里使用while循环。您想在变量中捕获返回的关联数组并通过该变量访问您的数据,如下所示:

while ($row = $resultArray) {
    echo $row["rowName"];
}

要进行排序,rowName您可以在查询中使用 mysqlorder by子句,如下所示,它会返回按 rowName 排序的结果:

$queryString = "SELECT rowName FROM tableName order by rowName";

OP发布完整代码后更新:

在您的第一个 if 语句中,如果连接失败会发生什么?您想在那里添加一些错误处理:

$connectionObject=mysqli_connect("host0", "username0", "password0", "mysqldatabase0"));
if (!$connectionObject) {
    // exist out of this script showing the error
    die("Error connecting to database " . mysqli_error($connectionObject));
} else {
    // Don't really need this else but I'll keep it here since you already had it
    echo "Con";
}

问题出在这里您使用单引号作为 mysql 标识符的列名和表名。MySQL标识符引号字符是反引号而不是单引号。
基本上,如果这些标识符之一是 mysql 保留字(MySQL Reserved words)之一,则需要使用反引号,对于其他情况,您不需要使用它们。

更新您的查询:

if ($queryString="SELECT `testdata` FROM `testtable`") {
    echo "Query"; // Leaving as is, not required
}

最后,一个改进。您还想在此处添加错误处理:

if ($resultObject=mysqli_query($connectionObject, $queryString)) {
  echo "Result"; // Leaving as is, not required
} else {
  echo "Error executing Query " . mysqli_error($connectionObject);
}

请注意,当您使用此脚本时,错误消息将在客户端打印,即当您在 Web 应用程序中使用此脚本时,错误将显示在用户的浏览器中。因此,您想研究实现日志记录而不是直接打印它们。

于 2013-08-13T02:56:01.423 回答
0

mysqli_fetch_assoc() 返回一行作为 mysqli_result 对象的关联数组。每次调用它时,它都会自动返回下一行结果,当与 while 循环一起使用时,可用于获取未知数量的结果行。

$row['columnName'] 用于引用列。例如,如果您有一个包含 firstName、lastName、dateOfBirth 列的人员对象,您可以使用 while 循环遍历每个人,如下所示:

while($row=mysqli_fetch_assoc($resultObject)){
 $fname = $row['firstName'];
 $lname = $row['lastName'];
 $dob = $row['dateOfBirth'];
 echo $fname . ' ' . $lname . ' ' . $dob;
}

这将回显返回未知人数的结果的详细信息。

请记住,调用

if ($resultArray=mysqli_fetch_assoc($resultObject)) {
echo "Array";
}

在 while 循环将跳过第一个结果之前,因此请确保在测试时查询返回多个结果,就好像您只提供包含一个结果的 resultObject 一样,这可能就是它没有返回任何内容的原因。检查是否返回任何结果的更好方法是使用 mysqli_num_rows($resultObject) 函数。

if(mysqli_num_rows($resultObject) > 0){
echo "Array";
}

也不确定这是否只是一个错字,但可以肯定的是,在您的查询中,您选择的是 columnName 而不是 rowName:

$queryString = "SELECT columnName1(eg. firstName), columnName2(eg. lastName) FROM tableName";

我最近刚开始学习 PHP,mysqli_fetch_assoc 函数也让我很困惑,所以希望对你有帮助!

于 2019-06-25T17:44:35.613 回答