MySQLI没有连接?查询未运行

时间:2017-04-25 01:31:52

标签: php sql azure azure-sql-database

我不会撒谎,我真的真的迷失在这里。这是我第一次尝试从php连接数据库。我选择使用microsoft azure来托管我的页面以及我的数据库。我也不确定在哪里可以找到DB主机名/用户名/传递等。我发现一些代码正在通过一个微软教程工作连接,但现在尝试插入一行,我觉得它可能是一个拐杖。

有人能告诉我哪里出错或者至少指出了我正确的方向吗?

<?php

$connectstr_dbhost = '';
$connectstr_dbname = '';
$connectstr_dbusername = '';
$connectstr_dbpassword = '';

foreach ($_SERVER as $key => $value) {
if (strpos($key, "MYSQLCONNSTR_acmedb") !== 0) {
continue;
}

$connectstr_dbhost = preg_replace("/^.*Data Source=(.+?);.*$/", "\\1", $value);
$connectstr_dbname = preg_replace("/^.*Database=(.+?);.*$/", "\\1", $value);
$connectstr_dbusername = preg_replace("/^.*User Id=(.+?);.*$/", "\\1", $value);
$connectstr_dbpassword = preg_replace("/^.*Password=(.+?)$/", "\\1", $value);
}

$link = mysqli_connect($connectstr_dbhost, $connectstr_dbusername, $connectstr_dbpassword,$connectstr_dbname);
mysqli_error($link);

$sql = "INSERT INTO 'users' (id, fname, lname, age)
VALUES (1, 'James', 'Casimir', 20)";

if (mysqli_query($link, $sql)) {
    echo "New record created successfully";
} else {
    echo "Error:james " . $sql . "<br>" . mysqli_error($link);
}
mysqli_close($link);



?>

2 个答案:

答案 0 :(得分:1)

热烈感谢Aaron Chen提供实际的输入样本。这有助于我理解数据。

如果您不知道确切的MYSQLCONNSTR_...密钥名称,那么您可以使用array_filter()$_SERVER数组中提取它而不是foreach循环。

当然,如果您确实知道要访问的确切$_SERVER密钥,那么您可以直接在$_SERVER[whateverkey]电话中使用preg_match_all()

您可以使用preg_match_all()list()来生成代码少于preg_replace()x4的相应变量。我的小正则表达式模式已经过演示/解释Here

// if you don't know the exact key name:    
$value=current(array_filter($_SERVER,function($k){return strpos($k,"MYSQLCONNSTR_")!==false;},ARRAY_FILTER_USE_KEY));

// if you do know the exact key name:
$value=$_SERVER["MYSQLCONNSTR_acmedb"];

// echo "TEST: $value<br>";
// my regex pattern returns all values in order between equals and semicolons
if(preg_match_all("/(?<==)[^;]+/",$value,$captured)){
    //var_export($captured[0]);
    list($db,$host,$user,$pass)=$captured[0];
}else{
    echo "Error extracting DB info with preg_match";
}

在第一个条件中,您可以声明并检查$link。 在$sql中,最安全的是在表名和列名周围使用反引号(`)(这并不总是必要的)。 第二个条件是,声明(运行)并检查$mysqli_query()的结果。

if($link=mysqli_connect($host,$user,$pass,$db)){
    $sql="INSERT INTO `users` (`id`,`fname`,`lname`,`age`) VALUES (1, 'James', 'Casimir', 20)";
    if(mysqli_query($link,$sql)){
        if(($aff_rows=mysqli_affected_rows($link))>0){
            echo "New record created successfully ($aff_rows)";
        }else{
            echo "Query Logic Error: $sql";
        }
    }else{
        echo "Syntax Error: ",mysqli_error($link);
    }
    mysqli_close($link);
}else{
    echo "Connection Error: ",mysqli_connect_error());  // not mysqli_error()
}

注意 :当您的网站上线时,不要回复任何错误;您不希望公众有权访问此信息。只需在//前加上<{1}}。

,就可以对打印到屏幕的行进行注释

答案 1 :(得分:1)

根据您的描述,我认为您在应用程序中使用Azure App Service MySQL。由于您将 MySQL In App 设置为开启,Azure将使用您的应用运行本地MySQL实例,并将连接字符串设置为环境变量MYSQLCONNSTR_localdb。< / p>

enter image description here

您还可以通过phpinfo()函数检查该环境变量。

enter image description here

因此,请考虑以下代码段以获取连接字符串:

foreach ($_SERVER as $key => $value)
{
    if (strpos($key, "MYSQLCONNSTR_") !== 0)
    {
        continue;
    }

    $connectstr_dbhost = preg_replace("/^.*Data Source=(.+?);.*$/", "\\1", $value);
    $connectstr_dbname = preg_replace("/^.*Database=(.+?);.*$/", "\\1", $value);
    $connectstr_dbusername = preg_replace("/^.*User Id=(.+?);.*$/", "\\1", $value);
    $connectstr_dbpassword = preg_replace("/^.*Password=(.+?)$/", "\\1", $value);

}

有关详细信息,请参阅this blog post