jackytom
@jackytom

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PHPで、暗号化してDBにinsertしようとするとエラーになる。

Q&A

Closed

下記を参考にして、PHPで暗号化してテーブルにinsertするソースを書いています。
https://qiita.com/mhagita/items/899483f08347fddd9567
そういたしますと、下記のエラーが出ます。

発生している問題・エラー

Uncaught Error: Call to undefined function HEX() in C:\xampp\htdocs\Portfolio\contact_commit.php:65 Stack trace: #0 {main} thrown in C:\xampp\htdocs\Portfolio\contact_commit.php on line 65

SQL文中の「HEX」が未定義関数と認識してしまっているようです。
試しに、

'$sei=HEX(AES_ENCRYPT(escape($_POST['sei']),".$pass."))'

と変数にしてみても、結果は同じでした。
更に、念のため、phpadminで直接insert文を実行してみましたが、こちらは問題なく登録
できました。
ということはPHP側の問題でしょうか?
原因究明にご協力いただければ幸いです。
ソースコードを添付いたします。

該当するソースコード

<?php
	session_start();
		if (isset($_POST['token']) && isset($_SESSION['token'])) {
			$token = $_POST['token'];
			}
			else if ($token != $_SESSION['token']) { 
				header("Location: contact.php");
				echo ('アクセスが中断されました。');
				exit();
				}
					else {
						header("Location: contact.php");
						echo ('不正なアクセスです');
						exit();
						}

	session_destroy();

	function escape($val)
	{
		return htmlspecialchars($val, ENT_QUOTES | ENT_HTML5, 'UTF-8');
	}
	require_once('db_connect.php');
	require_once('password_db.php')
?>
<!doctype html>
<html lang=ja>
	<head>
		<meta charset="utf-8">
		<title>Salon Yuri-rinへのお問い合わせ</title>
		<meta name="description" content="ヘッドセラピーを中心としたセラピーのサービスを提供しております。">
		<!--リセットcss-->
		<link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css">
		<!--css-->
		<link href="css/contact_style.css" rel="stylesheet">
		<!--レスポンシブ対応-->
		<meta name="viwport" content="width=device-width, initial-scale=1">
		<!--Googleフォント-->
		<link href="https://fonts.googleapis.com/css2?family=Sawarabi+Gothic&display=swap" rel="stylesheet">
		<link href="https://fonts.googleapis.com/css2?family=Shippori+Mincho:wght@500&display=swap" rel="stylesheet">
	</head>
	<body>
		<?php require_once('header.php');?>
		<main>
			<h1>
				Salon Yuri-rinへの問い合わせ
			</h1>
		<?php
			$sql=$pdo->prepare('insert into contact(contact_id,members_id,contact_date,last_name,first_name,last_name_kana,first_name_kana,mail_address,contact_div_id,contact_cont,agree_div,anser_date,anser_cont,anser_div,anser_user) values (null,null,null,?,?,?,?,?,?,?,1,null,null,null,null)');

			if($_SERVER['REQUEST_METHOD'] === 'POST'){
				if(empty(escape($_POST['sei'])) || empty(escape($_POST['mei'])) || empty(escape($_POST['sei_kana'])) || empty(escape($_POST['mei_kana'])) || empty(escape($_POST['mail_address'])) || empty(escape($_POST['contact_cont']))){
					echo '未入力の項目があります。';
				}
				else if(escape($_POST['contact_div']) === "0"){
					echo '問い合わせ区分を選択してください。';
				}
				else if(!preg_match('/\A[ァ-ヴー]+\z/u', $_POST['sei_kana']) || !preg_match('/\A[ァ-ヴー]+\z/u', $_POST['mei_kana'])){
					echo 'カナ名は全角カナで入力します。';
				}
				else if(!preg_match('/^[a-zA-Z0-9_.+-]+(\.[a-zA-Z0-9_+-]+)*@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$/',$_POST['mail_address'])){
					echo 'メールアドレスはメールアドレスの形式で入力します。';
				}
				else if($sql -> execute([
					HEX(AES_ENCRYPT(escape($_POST['sei']),".$pass.")),
					HEX(AES_ENCRYPT(escape($_POST['mei']),".$pass.")),
					HEX(AES_ENCRYPT(escape($_POST['sei_kana']),".$pass.")),
					HEX(AES_ENCRYPT(escape($_POST['mei_kana']),".$pass.")),
					HEX(AES_ENCRYPT(escape($_POST['mail_address']),".$pass.")),
					HEX(AES_ENCRYPT(escape($_POST['contact_div']),".$pass.")),
					HEX(AES_ENCRYPT(escape($_POST['contact_cont']),".$pass."))
					]))
					{
					require_once('contact_mail_c.php');
					require_once('contact_mail_s.php');
					header('Location: contact_end.php', true, 303);
					exit();
						}
						else {
							echo '登録に失敗しました。';
							}
		}?>
		<?php require_once('footer.php');?>
	</body>
</html>
0

1Answer

HEX(AES_ENCRYPT(escape($_POST['sei']),".$pass.")),

この書き方だとHEX(), AES_ENCRYPT(), escape() はPHPの関数として解釈されますが前者二つはそういう意図ではありませんよね?

execute()に渡している引数を事前に表示してみれば間違いがわかると思います。

1Like

Comments

  1. @jackytom

    Questioner

    回答ありがとうございます。
    executeからは削除し、$sql=$pdo->prepareにて、下記のように記述したところ、上手くいきました。

    $sql=$pdo->prepare('insert into contact(contact_id,members_id,contact_date,last_name,first_name,last_name_kana,first_name_kana,mail_address,contact_div_id,contact_cont,agree_div,anser_date,anser_cont,anser_div,anser_user) values
    (null,
    null,
    null,
    HEX(AES_ENCRYPT(?,".$pass.")),
    HEX(AES_ENCRYPT(?,".$pass.")),
    HEX(AES_ENCRYPT(?,".$pass.")),
    HEX(AES_ENCRYPT(?,".$pass.")),
    HEX(AES_ENCRYPT(?,".$pass.")),
    ?,
    ?,
    1,
    null,
    null,
    null,
    null)');

Your answer might help someone💌