47183


開発初心者の質問で分かりにくい点が多々あるかと存じますが、ご了承くださいませ。  
「Objective-C」にて「AFNetworking3.0」のライブラリを活用して、サーバー上（MAMP)  
にデータの送信を試みているのですが、MAMPのPHPエラーログに以下のようなエラーが発生致しております。1週間ほどかけ色々と修正を試みましたが、解消されませんでした。沢山エラーが発生しており、申し訳ございません。お分かりになる方、ご教授頂けますと幸いで御座います。宜しくお願い致します。

> ■エラー内容1  
>  PHP Deprecated: Methods with the same name as their class will not be
> constructors in a future version of PHP; Database has a deprecated
> constructor in /Applications/MAMP/htdocs/DatabaseClass.php on line 10
>
> ■10行目のコードは以下です。  
>  class Database{
>
> ■エラー内容2  
>  PHP Warning:mysqli_select_db() expects parameter 1 to be mysqli, string
> given in /Applications/MAMP/htdocs/DatabaseClass.php on line 37
>
> ■37行目のコードは以下です。  
>  $this->db=mysqli_select_db($this->dbName,$this->link);
>
> ■エラー内容３  
>  PHP Warning: mysqli_query() expects parameter 1 to be mysqli, string given
> in /Applications/MAMP/htdocs/DatabaseClass.php on line 40
>
> ■40行目のコードは以下です。  
>  $this->query=mysqli_query('SET NAMES utf8',$this->link);
>
> ■エラー内容4  
>  PHP Warning: mysqli_query() expects at least 2 parameters, 1 given in
> /Applications/MAMP/htdocs/DatabaseClass.php on line 61
>
> ■61行目のコードは以下です。  
>  return mysqli_query($query);
>
> ■エラー内容5  
>  PHP Warning: mysqli_fetch_object() expects parameter 1 to be mysqli_result,
> null given in /Applications/MAMP/htdocs/send_request.php on line 32
>
> ■32行目のコードは以下です。  
>  while ($row = mysqli_fetch_object($query)) {

■send_request.php（サーバー上にアップしたファイル１）

[code]

     <?php
     //DatabaseClassを読み込み
      include_once "DatabaseClass.php";
    
     //テーブル名と追加する値が選択されているかどうか確認
     if($_POST["table_name"] && $_POST["addtext1"] 
     && $_POST["addtext2"] && $_POST["addtext3"])
     {
     //DB名設定
     $table_name = $_POST["table_name"];
     $addtext1 = $_POST["addtext1"];
     $addtext2 = $_POST["addtext2"];
     $addtext3 = $_POST["addtext3"];
    
     $database = new Database("test");
    
     //データ追加用SQL
     $sql = "INSERT INTO {$table_name} (field_A,field_B,field_C) 
     VALUES ('{$addtext1}','{$addtext2}','{$addtext3}');";
    
     //クエリ送信
     $query = $database->query($sql);
    
     //一応結果を出力用SQL
     $sql = ("SELECT * FROM {$table_name}");
    
     //クエリ送信
     $query = $database->query($sql);
     $json= array();
    
    
     if(strstr($table_name, 'test_json')){
      while ($row = mysqli_fetch_object($query)) {
          $json[] = array(
             'field_A'=> $row->field_A
             ,'field_B'=> $row->field_B
             ,'field_C' => $row->field_C
          );
      }
      }//if(strstr($table_name, 'test_json'))
    
    
     //JSON形式で出力
     header("Content-Type: application/json; charset=utf-8");
     echo json_encode($json);
    
     //DBを閉じる
     $database->close();
    
     }//if($_POST["table_name"])
     ?>
    
[/code]

■Databaseclass.php（サーバー上にアップしたファイル２）

[code]

     <?php
    
    //内部文字コードを変更
    mb_language("uni");
    mb_internal_encoding("utf-8");
    mb_http_input("auto");
    mb_http_output("utf-8");
    
    class Database{
    
     var $dbServer;
     var $dbName;
     var $dbUser;
     var $dbPass;
     var $link;
     var $db;
     var $query;
    
     //DB接続
     function Database($db_name)
     {
      //DBの情報
      $this->dbServer="localhost:8889";
      $this->dbName=$db_name;
      $this->dbUser="root";
      $this->dbPass="XXXX";
    
      //MySQLに接続
      $this->link=mysqli_connect($this->dbServer,
                                $this->dbUser,
                                $this->dbPass)
             or
             die(exit);
    
      //DBを選択
      $this->db=mysqli_select_db($this->dbName,$this->link);
    
      //UTF-8の文字コードに変更
      $this->query=mysqli_query('SET NAMES utf8',$this->link);
     }
    
     //DBを閉じる
      public function close()
      {
      return mysqli_close($this->link);
      }
    
     //読み込むテーブルの選択
     public function select($query)
     {
      $result=mysqli_query($query);
      $row=array();
      $row=mysqli_fetch_assoc($result);
      return $row;
      }
    
      //指定したクエリの実行
      public function query($query)
      {
      return mysqli_query($query);
      }
    
      //JSON形式に変換用の出力
      public function jsonparse($query)
      {
      $row = mysqli_fetch_object($query);
      return $row;
      }
     }
     ?>
    
[/code]

■Objective-C（ビルド実行した内容)

[code]

     - (void)send_request
     {
     AFHTTPSessionManager* manager = [AFHTTPSessionManager manager];
     NSDictionary* postparam = @{ @"table_name" : @"test_json",
                             @"addtext1"   : @"add_A",
                             @"addtext2"   : @"add_B",
                             @"addtext3"   : @"add_C"};
     [manager POST:@"http://localhost:8888/send_request.php"
     parameters:postparam progress:nil
      success:^(NSURLSessionTask* task, id responseObject) {
          //通信成功
          NSLog(@"成功response: %@", responseObject);
      }
      failure:^(NSURLSessionTask* operation, NSError* error) {
          //通信失敗
          NSLog(@"失敗Error: %@", error);
      }];
      }
    
[/code]

> 補足情報  
>  データベース名：test  
>  テーブル名：test_json  
>  フィールド１：field_A  
>  フィールド２：field_B  
>  フィールド３：field_C  
>  Apache/2.4.6 (MSMP)  
>  PHP/7.2.77  
>  MySQL 5.7.21


CC BY-SA 4.0
2018-08-02T06:04:33.483
47181
2018-08-02T06:23:19.747
29466
question
php objective-c
iOSアプリからサーバ上のDBにデータを送信した際のPHPエラーの件


■エラー内容1  
コンストラクタの書き方が古いと言っています。  
Databaseclass.phpの

[code]

    function Database($db_name)
    {
    
[/code]

を

[code]

    function __construct($db_name)
    {
    
[/code]

に変更するか、Databaseメソッドがコンストラクタでなければ、別の名称を付けてください。  
参考：<http://php.net/manual/ja/language.oop5.decon.php>

■エラー内容2  
引数が逆です。

[code]

    $this->db=mysqli_select_db($this->link,$this->dbName);
    
[/code]

が正しいと思います  
参考：<http://php.net/manual/ja/mysqli.select-db.php>

■エラー内容３  
エラー内容２と同様、引数が逆です。

[code]

    $this->query=mysqli_query($this->link,'SET NAMES utf8');
    
[/code]

が正しいと思います  
参考：<http://php.net/manual/ja/mysqli.query.php>

■エラー内容4  
引数が足りません。  
mysqli_queryは2つの引数が必要です。  
第一引数に必要なDBへの接続ハンドラを指定してください。

[code]

      //指定したクエリの実行
      public function query($query)
      {
          return mysqli_query($query);
      }
    
[/code]

の個所を

[code]

      //指定したクエリの実行
      public function query($query)
      {
          return mysqli_query($this->link,$query);
      }
    
[/code]

としてみてください。  
参考：<http://php.net/manual/ja/mysqli.query.php>

■エラー内容5  
mysqli_fetch_object()の第一引数にmysqli_result形式のオブジェクトを指定してくださいと言っています。  
エラー内容4のエラーを解消すれば治るのではないかと思います。


CC BY-SA 4.0
2018-08-02T06:19:39.410
47183
2018-08-02T06:19:39.410
17014
47181
answer

[code]

    PHP Deprecated: Methods with the same name as their
    
[/code]

エラー内容1はPHP4時代のコンストラクタにClassと同じ名前をつけるという方式で非推奨になりました。  
<http://php.net/manual/ja/migration70.deprecated.php>  
そのためコンストラクタは以下のように書きましょう

[code]

    //DB接続
    function __construct($db_name)
    
[/code]

エラー内容2とエラー内容３  
は引数が逆ですね。第一引数はlinkです  
<http://php.net/manual/ja/mysqli.select-db.php>  
<http://php.net/manual/ja/mysqli.query.php>

エラー内容4  
は関数引数が足りません。  
<http://php.net/manual/ja/mysqli.query.php>

エラー内容5  
はエラー内容4が解決すれば動くと思います。

Databaseclass.phpですがもともとはPHP5系で動いていて、いまや削除になったmysql_**系を元にしていませんか？mysql_***系とmysqli_***系は似ていますが実態は全く違うものなのできちんと移行用に書き直す必要があると思います。  
<http://php.net/manual/ja/intro.mysql.php>  
<http://php.net/manual/ja/book.mysql.php>

確認お願いします。


CC BY-SA 4.0
2018-08-02T06:23:19.747
47184
2018-08-02T06:23:19.747
22665
47181
answer