「php」カテゴリーアーカイブ

XAMPPアップデートトラブル

切羽詰まっている時に限って、トラブルが起きるのは「よくあること」なんですが、XAMPPのApacheが突然起動しなくなり、ついでなので、XAMPPをアップデートしようと。

で、htdocsは保存したのに、DB関係をバックアップ撮らずにインストール。

結局DBは全消えだったので、本番サーバからDBの構造だけを持ってきて、再構築し、なんとか起動できるまで8日間。

(それまでデバッグは本番サーバで実施)

で、XAMPP7.2にアプデし、かなりいろいろあって、なんとかユーザ登録まで可能になったのですが、

とある部分で「doesn’t have a default value」のエラー

いろいろ調べるとSQLが厳密モード(STRICT_TRANS_TABLES)になってるからだと。

で、XAMPPのMySQLのConfigureからmy.confをいじっても変化無し。

さらに検索すると、phpMyAdminでいじるらしい。

phpMyAdminのトップページ>その他>変数 のsql modeをいじるらしい。

STRICT_TRANS_TABLES

を削除。

うごきました。

参照 https://stackoverflow.com/questions/41077044/mysql-can-not-insert-because-no-default-value

 

pusherテスト

アプリ内メッセンジャーの制作で、リアルタイム性を出すためにいろいろ検討した。Node.jsはなんかめんどそう。WebSocketも面倒そう。

で、サンプルコードが理解できたpusherにする。

<テスト環境の構築>

MacのXAMPPでPHPのComposerがいるらしい

$ composer
-bash: composer: command not found

入ってないらしい。

https://blog.fire-sign.info/686/

を参考にインストする

$ curl -sS https://getcomposer.org/installer | php

インスト始まる

ll settings correct for using Composer
Downloading...

Composer (version 1.10.9) successfully installed to: /Users/ユーザ名/composer.phar

どうも composer.pahr を特定のディレクトリにいれなきゃらしい

$ sudo mv composer.phar /usr/local/bin/composer

移動できたのでバージョンチェック

$ composer --version
Composer version 1.10.9 2020-07-16 12:57:00

このバージョンが入りましたとさ

肝心のpusherを入れる

$ composer require pusher/pusher-php-server
Using version ^4.1 for pusher/pusher-php-server
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files

でインスト終わる。

うまくいかない

$ sudo nano .bash_profile

export PATH=$PATH:/Applications/XAMPP/bin

を追加(Mac)

source ~/.bash_profile

して実行

 

複数あるチェックボックスを4個までに制限する

忙しいときは書けない、、、

複数あるチェックボックスを4つまで選択可能にし、4つ超えると警告を出し、最後に選択したチェックを外します。

 

<script>
function checkIDset(hitID){
	const idArr = [];
	const id_tag = document.getElementsByName("checkID");

	for (let i = 0; i < id_tag.length; i++){
		if(id_tag[i].checked){ //(color2[i].checked === true)と同じ
            
            if(idArr.length > 3){
                //警告出す
                alert('4人以上は選択できません');
                //最後に選択したIDのチェックを外す
                const rmvTag = document.getElementById(hitID);
                rmvTag.checked = false;
            }else{
                idArr.push(id_tag[i].id);
            }
		}
	}
    
 
}
</script>

 

 

PHP部分

<?php 
                            echo '<div class="input-group m-1 p-0"><div class="input-group-prepend"><div class="input-group-text p-1"><input type="checkbox" onchange="checkIDset('.$value['id'].')" name = "checkID" id="'. $value['id'] . '"></div></div><span class="form-control"><label for="'. $value['id'] . '"><span class="badge badge-primary">本人</span><span style="font-size:0.9rem;">' .  $value['name'] . 'さん</span></span></label></div>'; 
                            ?>

 

スクリプト事例ースコアをランキングして表示

PHP用のスクリプト(コア部分)

    $query = "SELECT * FROM `scores` ORDER by `score` DESC, `time` ASC LIMIT 20";//score timeの順にソート
    $result = mysql_query($query) or die('Query failed: ' . mysql_error());
 
    $num_results = mysql_num_rows($result);  
 
    for($i = 0; $i < $num_results; $i++)
    {
         $row = mysql_fetch_array($result);
		 echo $row['cName'] . "\t" . $row['name'] . "\t" . $row['score'] . "\t". $row['time'] ."\n";
    }

score(降順)と time(昇順)でソートしたデータの

色,名前,スコア,時間を表示している

 

ユーザ名重複をチェックしていないので,1人で何ランキングも表示される.ユーザ名重複チェックは,PHP側,Unity側のどちらですればいいのか,今後検討.

UGUIのテキストをSQLでチェックするPHP

そのユーザ名が存在するかチェックする

<?php
    // Send variables for the MySQL database class.
    $database = mysql_connect('myserver.jp', 'username', 'passwd') or die('Could not connect: ' . mysql_error());
    mysql_select_db('dbname') or die('Could not select database');
	
	
	
	//変数宣言
$keyword='';	//不正防止用キーワード
$resultData='';	//返すデータ
 
//データ受け取り
if(isset($_POST['keyword'])){
  $keyword=$_POST['keyword'];	//キーワード
  
}
//print $_POST['keyword'];
$name= $_POST['keyword'];
//print $name;
//if($keyword==null or !($keyword==$key['get_score_ranking'])){
//  $redirectUrl = "http://filmm.info/404.html";
//  header("HTTP/1.0 404 Not Found");
//  print(file_get_contents($redirectUrl));
//  exit;
//}



//search test
	$nameresult = mysql_query("SELECT * FROM `scores` WHERE `name` = $name");//文字列検索はシングルクォート
if (!$nameresult) {
    die('クエリーが失敗しました。'.mysql_error());
}
//echo mysql_num_rows($nameresult);
	print mysql_num_rows($nameresult);
	
?>

かなり不要部分多し

ちょっとセキュリティ的には良くない部分有り

スコアを追加するPHP

Unityから呼び出したサーバ側に設置するPHPです

<?php 
        $db = mysql_connect('severurl', 'sq_lusername', 'sql_password') or die('Could not connect: ' . mysql_error()); 
        mysql_select_db('sql?database_name') or die('Could not select database');
 
        // Strings must be escaped to prevent SQL injection attack. 
        $name = mysql_real_escape_string($_GET['name'], $db); 
        $score = mysql_real_escape_string($_GET['score'], $db);
		$cName = mysql_real_escape_string($_GET['cName'], $db); 
        $hash = $_GET['hash']; 
 
        $secretKey="****"; # Change this value to match the value stored in the client javascript below 

        $real_hash = md5($name . $score . $cName . $secretKey); 
        if($real_hash == $hash) { 
            // Send variables for the MySQL database class. 
            $query = "insert into scores values (NULL, '$name', '$score', '$cName');"; 
            $result = mysql_query($query) or die('Query failed: ' . mysql_error()); 
        } 
?>

スコアを追加できます

mySQL覚え書き

自鯖のmysql

同セグメントからの他IPでも,sqlへの書き込みできない

phpは動作している

phpmyAdminでも動作は確認している

mysqlの設定ファイルが,ローカル向けになっているのが原因(外からは見えたりするのに)

sudo nano /etc/mysql/my.cnf

の設定ファイルを変更

bind-address = 127.0.0.1

#bind-address = 127.0.0.1

でコメントアウトしどこからでも接続可能にする(ただし危険)

物理的に外とつながらないサーバの予定なので,これでも一応OK.

外でタブレットを使い,クローズド環境でのWSの実験用の予定