//エラーを表示しない(スクリプトテスト時はコメントアウトし、エラーを検知する) // ini_set ("display_errors","0");//Hide errors ini_set ("display_errors","1");//Display errors // error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);//Use with 'ini_set' above // error_reporting(E_ERROR);//Show only fatal errors //UID - Who owns this script file //$getmyuid=getmyuid(); //echo '$getmyuid='.$getmyuid; //In Safe Mode, the script must be owned by the same owner who uses the script. If it includes other files, those also must be owned by the same owner who uses. /* << プログラム 〜 PHPにおける設定 >> [ /etc/php/7.0/apache2/php.ini ] ... ; エラー非表示 ; display_errors = Off ; エラー表示 display_errors = On なお、ファイルを編集後は、WEBサーバを再起動して、変更を反響させる。 # service apache2 reload ===== * ===== * ===== * ===== * ===== * ===== * ===== * ===== * ===== * ===== * << データベース 〜 MySQLにおける設定 >> mysql> select @@tmpdir; +----------+ | @@tmpdir | +----------+ | /tmp | +----------+ 1 row in set (0.00 sec) mysql> SELECT @@secure_file_priv; +-----------------------+ | @@secure_file_priv | +-----------------------+ | /var/lib/mysql-files/ | +-----------------------+ 1 row in set (0.00 sec) mysql> show variables like "chara%"; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.02 sec) mysql> SELECT @@global.sql_mode\G *************************** 1. row *************************** @@global.sql_mode: ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER 1 row in set (0.00 sec) --(+)-- --(+)-- --(+)-- --(+)-- --(+)-- --(+)-- --(+)-- --(+)-- ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 「/var/lib/mysql-files/」は、エクスポートファイルなどを出力するディレクトリ。「/var/lib/mysql-files/」以外のディレクトリには出力できない。 文字化けする。 「character_set_server」に、「utf8」を指定する。 ERROR 1366 (HY000): Incorrect integer value: '' for column 'id' at row 1 フィールドに設定したデータ型と挿入しようとする値が異なるとエラーを発生し、データを記録できない。 「NO_ENGINE_SUBSTITUTION」「STRICT_TRANS_TABLES」を除外する。 --(+)-- --(+)-- --(+)-- --(+)-- --(+)-- --(+)-- --(+)-- --(+)-- [ /etc/mysql/my.cnf ] ... [mysqld] #tmpdir = '/tmpdir1' #secure-file-priv = '/dir_export1/' #secure-file-priv = '/tmp/' #secure-file-priv = '' sql_mode = ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER character-set-server = utf8 なお、ファイルを編集後は、DATABASEサーバを再起動して、変更を反響させる。 # /etc/init.d/mysql restart ===== * ===== * ===== * ===== * ===== * ===== * ===== * ===== * ===== * ===== * (画像投稿) ● ファイルシステム $dir_name='img';// Name of directory to save images. dir1 - index.php - img - database1 - table1 - image1.jpg, image2.png, image3.bmp... ● データベース 「画像データのデータベースのテーブルの構造」 [ database1 > table1 ] mysql> show columns from database1.table1; +---------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+----------------+ | id | mediumint(9) | NO | PRI | NULL | auto_increment | | column1 | char(10) | YES | | NULL | | | column2 | varchar(32) | YES | | NULL | | | column3 | varchar(255) | YES | | NULL | | +---------+--------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec) id: 123 column1: aaa column2: bbb column3: ccc [ database1 > table1 ] mysql> DESCRIBE database1.`table1`; +----------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+--------------+------+-----+---------+----------------+ | id | mediumint | NO | PRI | NULL | auto_increment | | id_log | mediumint | YES | | NULL | | | id_user | mediumint | YES | | NULL | | | id_text | mediumint | YES | | NULL | | | order_image | mediumint | YES | | NULL | | | name_timestamp | varchar(32) | YES | | NULL | | | name_original | varchar(255) | YES | | NULL | | | file_size | int | YES | | NULL | | | file_type | char(10) | YES | | NULL | | | file_dimension | varchar(32) | YES | | NULL | | +----------------+--------------+------+-----+---------+----------------+ mysql> SELECT * FROM database1.`table1`\G *************************** 1. row *************************** id: 1 id_log: 1 id_user: 1 id_text: 1 order_image: 1 name_timestamp: 20221020094737ggb3.jpg name_original: maxresdefault.jpg file_size: 82910 file_type: jpg file_dimension: 1280x720 ===== * ===== * ===== * ===== * ===== * ===== * ===== * ===== * ===== * ===== * (データベース内の検索) function func_data ($sql) {...}// 取得したMySQLコード($sql)を発行し、データをそれぞれのフィールド名の配列として取得する。 $sql="SELECT * FROM $database.$table$where$orderby"; // SQL文を完成させる。 $count=func_data ($sql); // List: データの取得 // $countはレコード数であり、func_html_form()において表示するための記事のコードを何度繰り返すかの数。 */ /* [ Structure (Conditions) ] Selected database: html_database() User command: html_command() · Data (cmd=data) · · Import (cmd2=import) · · Export (cmd2=Export) · · Delete (cmd2=delete) · Serial Input (cmd=input) · Input (cmd=input) --> Database, file system --> (Return) · · Form (cmd2=form) --> Input (cmd2=input) --> (Return) · Search (cmd=search) · · Form (cmd2=form): page_search_form() --> Result (cmd2=result) · · Result (cmd2=result): page_search_result() --> Form (cmd2=form) · · · prev page (word=$word&pointer_article=$num_search*($num_page-2)) · · · next page (word=$word&pointer_article=$num_search*$num_page) Form: html_form() Result: html_result() */ /* [ Program ] (Page: Search > Form) Conditions: cmd=search&cmd2=form · Selected database · User command · Search (Form) -- [HTML] Form (PHP: blank): [HTML] Text (PHP: Form) + [HTML] Image (PHP: Form) function html_page() { global $cmd, $cmd2 html_database($database); html_command($cmd, $cmd2); html_form(); html_result(); } html_form_input() (Page: Search > Result) Conditions: cmd=result&cmd2=form · Selected database · User command · Search (Form) -- [HTML] Form (PHP: filled): [HTML] Text (PHP: Text/Form) + [HTML] Image (PHP: Yes/No) · Search (Result) -- [PHP: for] { [HTML] Text (PHP: Result) + [HTML] Image (PHP: Result) } (Page: Serial Input) [HTML] Selected database [HTML] User command (PHP: Serial Input) [HTML] Form (PHP: Form): [HTML] Text (PHP: Form) + [HTML] Image (PHP: Form) --> [MySQL] Text: Insert + [MySQL] Image: Insert + [File] Image: Upload --> [HTML] Form (PHP: Form) · Input · · [HTML] Form (PHP: Input) · Search · · [HTML] Form (PHP: Search) · · Search results */ /* [ Functions ] (Page: Serial Input) [HTML] Form (PHP: Input): html_form_input() · [HTML] Text (PHP: Input): html_form_input_text() · [HTML] Image (PHP: Input): html_form_input_image() */ /* input --> (insert) --> input search --> (select) --> result --> edit --> (update) --> search input: cmd=input&exe=0 (insert) --> input: cmd=input&exe=1 search: cmd=search&exe=0 (select) --> result: cmd=search&exe=1 edit: cmd=edit&exe=0 (update) --> search: cmd=edit&exe=1 */ /* ■ ページを表示するには? 1.ユーザがクエリ送信したデータを取得し、必要となる全てのデータをデータベースから取得する。 2.それらのデータを加工して、ページ内に表示できる様式に成形する。 3.それらのデータをページ内に配置する。 */ $array_inherit=array('PHPSESSID','MAX_FILE_SIZE'); // $_GETのパラメタの最大サイズは、デフォルトで512文字であるが、「php.ini」において、「suhosin.get.max_value_length = 」のように設定できる。 // 「php_command($table)」は、フォーム(もしくは、フォームを「枠」とする検索結果)に入れるユーザ入力データ(もしくは、空白)を取得するための関数である。これには、(二重配列構造の)検索結果も含まれる。 // 「html_result()」は、「php_command($table)」において取得したフォームの「枠」(つまり、$Types)や検索結果(つまり、$Results)を表示するための関数である。そのフォーマットである「枠」やそれに嵌め込むデータは、「php_command($table)」において取得してあるので、「html_result($Types, $Results)」のように引数として渡すのではなく、関数内においてグローバル関数(global $Types,$Results)として定義する。逆に言えば、「html_result()」において使用する$Typesと$Resultsは、「php_command($table)」において取得しておかなければならない。 // 入力も検索も、空白フォームを必要とする。入力の実行は、データベースへの書き込みや画像などのファイルを含むのであれば、ファイルシステムへのアップロードを含む。それらは、二重書き込みを防止するために、再読み込みができないようにリダイレクト(ヘッダ転送)「header("Location: http://$Url?$http_build_query_default");exit; 」する。一方、検索結果の表示は、再読み込みをしても(その間データベースへの書き込みなどがなければ)同じ結果を得られるので、また、敢えてリダイレクト処理を実行しようとすると、フォーム(POST送信)からクエリ(GET送信)に必要があり、面倒である。よって、検索結果の表示は、そのまま再読み込みを許可する。 // つまりは、データベースへの書き込み(もしくは、アップデート)をする場合は、その処理を実行した後、リダイレクトし、新たなページを表示する処理を実行する。一方、それ以外であれば、例えば、検索結果を表示する場合も、一連のページを表示する処理を実行する。 // 「func_insert($table)」は、テーブル内($table)における全てのフィールド($Types)を変数とその値をデータベースに書き込むための関数である。よって、$Typesは予め取得しておく必要があり、それは書き込みを実行する直前に、関数「func_insert()」の引数「$table」(テーブル)からそのフィールド($Types)をその都度「list($Types,$Default)=mysql_field($table_image)」のようにして取得した方が、汎用性が高い。 // 「func_insert($table)」を使用するのは、ユーザ入力データの書き込み(INSERT)の場合であり、テーブル内に定義してある全てのフィールド($Types)に値を入れるため、$Typesを取得する必要がある。テキストデータをユーザ入力から取得するには、php_variable($Types, $Default)が必要であり、そこで使用される引数は、「list($Types,$Default)=mysql_field($table)」から得られる(つまり、関数「php_variable」に、関数「mysql_field」を前置する)。一方、イメージデータは、ユーザがアップロードしたイメージの属性を取得したり、プログラムやデータベースから得られたデータを取得しているため、関数「php_variable」を用いない(関数ではなく、それぞれのコードでを用いる)。つまり、データベースに書き込むべきデータは、手動でプログラムを描いている人(自分)が、イメージデータのデータベースの構造を認識した上で、そのコードを書いている。よって、全てのフィールド($Types)データに関しても、自分がそれを心得ている。よって、「func_insert($table)」を使用する前に、$Typesを直接設定する、もしくは、テキストデータの書き込みの際に使用する関数「php_variable」で生成した$Typesをunsetにした上で、関数「func_insert」内で、「list($Types,$Default)=mysql_field($table)」を置くかの二択である。 /* To save the resource $Tables=array("teacher","user","student","seller");//Result of above */ /* // 関数:func_table () 引数:$database 戻り値:$Tables echo '$database='.$database."

"; echo '$Tables=';print_r ($Tables); (出力例) $database=people $Tables=Array ( [0] => seller [1] => student [2] => teacher [3] => user ) */ //$Flips=array_flip($Fields);// 値(フィールド名)からキー(序数)を取得するため定義する。 // リダイレクト処理「header("Location: …");exit;」の後に置く。さもなくば、「Warning: Cannot modify header information - headers already sent by (output started at /dir1/index.php:111) in /dir1/index.php on line 222」のエラーが発生する。 // $_SERVER['QUERY_STRING']は、クエリ送信に見られるようなスカラーで、$_GETは、同じ内容の連想配列、$_POSTは、フォームデータの連想配列、$_REQUEST=$_GET+$_GET。 // $http_build_query=http_build_query($_REQUEST); // parse_str($http_build_query, $_REQUEST); //echo "\t
\n"; // $_GETのデータが引き継がれる。 //echo "\t\n"; //echo "\t\n"; // $_GETのデータは引き継がれない。 /* << 文字セットを「utf8」に変更する >> (設定ファイルの編集) # vim /etc/mysql/my.cnf ... [mysqld] character-set-server=utf8 (MySQLの再起動) # /etc/init.d/mysql restart // MySQLにおいて設定すれば、以下のコードは不要。設定しなければ、データベースに接続する毎に以下のコードが必要となる。 $con=mysqli_connect("localhost","root","sqlhirona") or die("Failed"); //データベースに接続する printf("Initial character set: %s\n", mysqli_character_set_name($con)."
"); if (!mysqli_set_charset($con, "utf8")) { printf("Error loading character set utf8: %s\n", mysqli_error($con)); exit(); } else { printf("Current character set: %s\n", mysqli_character_set_name($con)."
"); } mysqli_close($con);// データベースへの接続を切断する */ 【MySQLの文字コードを変更する】 (@ Linux) $ sudo chmod 777 /etc/mysql/mysql.cnf [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] collation-server = utf8mb4_unicode_520_ci init-connect='SET NAMES utf8mb4' character-set-server = utf8mb4 $ sudo systemctl restart mysql $ sudo chmod 644 /etc/mysql/mysql.cnf ※ 効果は見られなかった。 (@ MySQL) mysql> ALTER DATABASE has CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; Query OK, 1 row affected (0.01 sec) mysql> SHOW VARIABLES LIKE 'chara%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8mb3 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) mysql> show variables like 'collation%'; +----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_0900_ai_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_0900_ai_ci | +----------------------+--------------------+ 3 rows in set (0.00 sec) ※ 以下のように変更可能。 # character_set_database --> utf8mb4 # collation_database --> utf8mb4_unicode_ci (参照) https://mathiasbynens.be/notes/mysql-utf8mb4 # For each database: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # For each table: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # For each column: ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)