【问题标题】:Get info from MariaDB in PHP使用 PHP 从 MariaDB 获取信息
【发布时间】:2021-01-26 15:21:16
【问题描述】:

我有一个 PHP 代码,只是为了用 MariaDB 将值存储在一个简单的数据库中。

这是我的桌子:

create table test(
    id int NOT NULL AUTO_INCREMENT,
    name varchar(255) UNIQUE,
    date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
);

这是 PHP 代码:

<meta http-equiv="refresh" content="6;http://10.15.34.194/form.html">

<?php
$host = "localhost";
$db_name = "XXX";
$username = "XXX";
$password = "XXX";
$connection = null;

try{
    $connection = new PDO("mysql:host=" . $host . ";dbname=" . $db_name, $username, $password);
    $connection->exec("set names utf8");
}catch(PDOException $exception){
    echo "Connection error: " . $exception->getMessage();
}

function saveData($name){
    global $connection;
    $query = "INSERT INTO test(name) VALUES( :name )";
    $callToDb = $connection->prepare( $query );
    $name=htmlspecialchars(strip_tags($name));
    $callToDb->bindParam(":name", $name);

    if (!$callToDb->execute()) {
        $affected_rows = $callToDb->rowCount();

        if ($affected_rows == 0) {
            printf('<h1> register: ' . $name . ' ALREADY IN TABLE </h1>');
        }
    } else { 
        printf('<h1> SAVING RESULT ' . $name .  '</h1>'); 
    }
}


if( isset($_POST['submit'])){
    $name = htmlentities($_POST['name']);
    $result = saveData($name);
    echo $result;
}
else{
    echo '<h3 style="text-align:center;">ERROR</h3>';
}
?>

我只想在此 printf 中显示存储值时数据库中的时间戳。

printf('<h1> register: ' . $name . ' ALREADY IN TABLE </h1>');
    

现在我尝试的只是注册一个值,当它重复时,只显示表中已经存在的名称和警告。但我也想显示在我的表中生成的时间戳(并存储在 clumn“日期”中)。

我尝试创建第二个查询,但代码出现问题。

我想创建一个类似于这个的 printf:

printf('<h1> register: ' . $name . ' ALREADY IN TABLE </h1>' '<h1> timestamp : ' . $date . '</h1>);
    

不确定如何创建第二个数据库连接,以及如何使用 $name 变量重新创建新查询以获取重复变量的时间戳,并同时包含 $name 变量和 $date。

【问题讨论】:

    标签: php mysql linux mariadb


    【解决方案1】:

    您可以使用try {} catch () {} 方法:

    function saveData($connection, $name){
        //global $connection;
        
        $query = "INSERT INTO test(name) VALUES( :name )";
        $callToDb = $connection->prepare( $query );
        $name=htmlspecialchars(strip_tags($name));
        $callToDb->bindParam(":name", $name);
    
        try {
            $callToDb->execute();
            printf('<h1> register: ' . $name . ' </h1>');
        } catch (PDOException $e) {
            $error = $e->errorInfo;
            printf('<h1> SAVING RESULT ' . $error[2] .  '</h1>'); 
        }
    }
    

    share PHP code

    【讨论】:

      【解决方案2】:

      使用此查询,您可以从数据库中选择它。

      
      <?php
      function saveData($connection, $name){
          $query = "INSERT INTO test(name) VALUES( :name )";
          $callToDb = $connection->prepare( $query );
          $name=htmlspecialchars(strip_tags($name));
          $callToDb->bindParam(":name", $name);
      
          try {
              $callToDb->execute();
              printf('<h1> register: ' . $name . ' </h1>');
          } catch (PDOException $e) {
              $error = $e->errorInfo;
              printf('<h1> SAVING RESULT ' . $error[2] .  '</h1>'); 
          }
          $query = "SELECT date FROM test WHERE name = ?";
          $result = $connection->prepare($query);
          try {
          $result->execute([$name]);
          $date = $result->fetch();
          printf('<h1> on ' . $date . '</h1>');
          }catch(PDOException $e){
              $error = $e->errorInfo;
              printf('<h1> SAVING RESULT ' . $error[2] .  '</h1>'); 
          }
      }
      //just to test the connection
      $name = 'Gerrit';
      $result = saveData($connection, $name);
      
      

      My PHP Code / Tests

      致谢:@Slava Rozhnev(他编写了大部分代码。只是为了更好地回答这个问题,而不是窃取它或其他什么)

      【讨论】:

      • 我尝试在我的第一个“callToDb”之后添加您的代码,但它不起作用。密码坏了。
      • 我在 apache 中收到此消息:PHP 致命错误:在第 20 行的 /var/www/html/form_submit.php 中的非对象上调用成员函数 prepare(),引用者:xxxx /app.html 我基本上用我的函数替换了你的函数,还有 $resul
      • @XT 您是否将 saveData($pdo, $name) 更改为您的配置?你需要给它你自己的 PDO 变量。
      • 好吧,在我原来的 saveData 中,我没有任何 pdo,只有 $name。您能否澄清一下我应该根据我的功能放置哪个 pdo 以避免任何混淆。谢谢!!
      • 您创建了一个变量 $connection,即您的 PDO 变量。所以你应该使用:result = saveData($connection, $name);
      【解决方案3】:

      这是我在函数 saveData 中所做的修改

      function saveData($connection, $name){
        $query = "INSERT INTO test(name) VALUES( :name )";
        $callToDb = $connection->prepare( $query );
        $name=htmlspecialchars(strip_tags($name));
        $callToDb->bindParam(":name", $name);
        try {
            $callToDb->execute();
            printf('<h1> register: ' . $name . ' </h1>');
        } catch (PDOException $e) {
            $error = $e->errorInfo;
            printf('<h1> SAVING RESULT ' . $error[2] .  '</h1>'); 
        }
        $query = "SELECT date FROM test WHERE name = ?";
        $result = $connection->prepare($query);
        try {
        $result->execute([$name]);
        $date = $result->fetch();
        printf('<h1> on ' . $date . '</h1>');
        }catch(PDOException $e){
            $error = $e->errorInfo;
            printf('<h1> SAVING RESULT ' . $error[2] .  '</h1>'); 
        }
      }
      if( isset($_POST['submit'])){
      $name = htmlentities($_POST['name']);
      $result = saveData($connection, $name)
      

      `

      当我尝试注册一个 vlaue 时,我在浏览器上看到了这个: 值是否已注册并不重要,我总是得到相同的值,并且该值似乎没有在数据库中注册。

      即使我尝试在“saveData 函数”中修改“寄存器”变量(例如 register2),我也会得到相同的结果。

      只要尚未注册,正确的行为就是注册一个值。如果已注册,则应显示该值已在“日期和时间”注册的消息。

      注册:44 在阵列上

      【讨论】:

        【解决方案4】:

        我试图在我的代码中添加这个,以便获得它已经注册的注册日期:

          $callToDb->bindParam(":name", $name);
           if (!$callToDb->execute()) {
           $affected_rows = $callToDb->rowCount();
            if ($affected_rows == 0) {
              $result2 = $connection->prepare("SELECT date FROM test WHERE name = ?");
              $result2->execute([$name]);
              $datee = $result2->fetch();
              echo '<h1> register: ' . $name . ' ALREADY IN TABLE </h1>' '<h1> timestamp : ' . 
              $datee . '</h1>';
          }
         } else { 
         printf('<h1> adding: ' . $name .  '</h1>'); 
         }
        } 
        

        `

        但它根本不起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-28
          • 2013-01-03
          • 2023-04-06
          • 2016-01-09
          • 2018-04-10
          • 1970-01-01
          • 1970-01-01
          • 2016-12-19
          相关资源
          最近更新 更多