ゆう's Blog
Deprecated: Implicit conversion from float to int loses precision in

$moto_x = (int)$moto_x;

または、四捨五入する。
$moto_x = round($moto_x);

フォームデータを順序どおりに取得し、value値をコンマ区切りの文字列に変換する

$form_order = array('first', 'second', 'third'); // 順序を定義 $ordered_values = array(); foreach ($form_order as $key) { if (isset($_POST[$key])) { $ordered_values[] = $_POST[$key]; } } // コンマ区切りの文字列に変換 $csv_string = implode(',', $ordered_values); // 結果を表示(または他の処理) echo $csv_string;

ページネーション

<?php $max_posts_page = 3; $count_post = 30; $page_get = $_GET['p'] ?? '1'; $page_end = $page_get * $max_posts_page; $page_first = $page_end - $max_posts_page; $max_pages = ceil($count_post / $max_posts_page); $max_pages = ( $max_pages == 0 ) ? 1 : $max_pages; $this_page = basename(__FILE__); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>ページネーション</title> <link rel="icon" href="favicon.svg" type="image/svg+xml"> <style> .pagination { margin-top: 2em; text-align: center; font-size: 12px; } .pagination a, .pagination span { display: inline-block; margin: 4px 2px; text-decoration: none; border-radius: 4px; width: 30px; height: 30px; padding: 7px 0; box-sizing: border-box; color: #000; border: 2px solid #000; font-weight: bold; line-height: 1; } .pagination a:hover { color: #000; opacity: 0.7; } .pagination .page-current { border: none; background: transparent; } .prev-x, .next-x { cursor: no-drop; } </style> </head> <body> <div class="pagination"> <div class="nav-links"> <?php if ($page_get == "1"): ?> <span id="prev-x" class="prev-x page-numbers">&lsaquo;</span> <?php else: ?> <a id="prev" class="prev page-numbers" href="./<?php echo $this_page ; ?>?p=<?php echo $page_get - 1; ?>">&lsaquo;</a> <?php endif; ?> <?php if ($page_get != "1"): ?> <a id="first" class="first page-numbers" href="./<?php echo $this_page ; ?>?p=1">1</a> <?php endif; ?> <?php if ($page_get >= "5"): ?> <span id="dots_left" class="page-numbers dots">…</span> <?php endif; ?> <?php for ($i = max(2, $page_get - 2); $i < $page_get; $i++): ?> <a id="page-numbers<?php echo $i; ?>" class="page-numbers" href="./<?php echo $this_page ; ?>?p=<?php echo $i; ?>"><?php echo $i; ?></a> <?php endfor; ?> <span aria-current="page" class="page-numbers page-current"><?php echo $page_get; ?></span> <?php for ($i = $page_get + 1; $i <= min($page_get + 2, $max_pages - 1); $i++): ?> <a id="page-numbers<?php echo $i; ?>" class="page-numbers" href="./<?php echo $this_page ; ?>?p=<?php echo $i; ?>"><?php echo $i; ?></a> <?php endfor; ?> <?php if ($max_pages - $page_get >= "4"): ?> <span id="dots_right" class="page-numbers dots">…</span> <?php endif; ?> <?php if ($page_get != $max_pages): ?> <a id="last" class="last page-numbers" href="./<?php echo $this_page ; ?>?p=<?php echo $max_pages; ?>"><?php echo $max_pages; ?></a> <?php endif; ?> <?php if ($page_get == $max_pages): ?> <span id="next-x" class="next-x page-numbers">&rsaquo;</span> <?php else: ?> <a id="next" class="next page-numbers" href="./<?php echo $this_page ; ?>?p=<?php echo $page_get + 1; ?>">&rsaquo;</a> <?php endif; ?> </div> </div> </body> </html>

PHPMailer

<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; use PHPMailer\PHPMailer\SMTP; require 'path/to/PHPMailer/src/Exception.php'; require 'path/to/PHPMailer/src/PHPMailer.php'; require 'path/to/PHPMailer/src/SMTP.php'; function sendMail($to, $toname, $subject, $body) { // 文字エンコードを指定 mb_language('uni'); mb_internal_encoding('UTF-8'); $mail = new PHPMailer(true); try { //Enable SMTP debugging //SMTP::DEBUG_OFF = off (for production use) //SMTP::DEBUG_CLIENT = client messages //SMTP::DEBUG_SERVER = client and server messages $mail->SMTPDebug = SMTP::DEBUG_SERVER; $mail->isSMTP(); $mail->Host = SMTP_SERVER; $mail->SMTPAuth = true; $mail->Username = SMTP_USER; $mail->Password = SMTP_PASS; $mail->SMTPSecure = 'tls'; $mail->Port = SMTP_PORT; $mail->CharSet = "utf-8"; $mail->setFrom(FROM_MAIL, SITE_NAME); $mail->addAddress($to, $toname); //$mail->addReplyTo('info@example.com', 'Information'); //$mail->addCC('cc@example.com'); //$mail->addBCC('bcc@example.com'); //Attachments //$mail->addAttachment('/var/tmp/file.tar.gz'); //$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); $mail->isHTML(true); $mail->Subject = $subject; $mail->Body = $body; $mail->send(); echo 'Message has been sent'; } catch (Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; } } ?>


Fatal error: Uncaught Error: Class "SMTP" not found

use PHPMailer\PHPMailer\SMTP;
SMTPプロトコルを使用してメールを送信することができ、メッセージの配信可能性が向上します。また、SMTPクラスを使用することで、エラーハンドリングやデバッグ機能も利用できるようになり、問題が発生した際の原因特定が容易になります。

Imagickのclear(), destroy()

$imagick = new Imagick(); 画像処理 $imagick->clear(); $imagick->destroy();

clear(): これは、Imagick オブジェクトの内部リソースを解放しますが、オブジェクト自体はそのまま残ります。例えば、同じオブジェクトを再利用する場合に使用します。

destroy(): これは、Imagick オブジェクト自体を破棄し、すべてのリソースを解放します。オブジェクトをもう使用しない場合に使用します。

基本的には、スクリプトの終了時やオブジェクトを再利用しない場合には destroy() を使用し、オブジェクトを再利用する場合には clear() を使用するのが一般的です。

destroy() を使用する場合、clear() を明示的に呼び出す必要はありません。destroy() は Imagick オブジェクトとそのすべてのリソースを完全に解放するため、clear() の機能も含まれています。

Imagick 画像縮小コマンド

resizeImageは高品質なリサイズが必要な場合に適しており、thumbnailImageは小さなサムネイルを素早く生成するのに適しています。

resizeImage with EXIF removal

$image = new Imagick('path/to/image.jpg'); $image->resizeImage($width, 0, Imagick::FILTER_LANCZOS, 1, true); // 幅を指定し、高さは自動計算 $image->stripImage(); // EXIF情報を削除 $image->writeImage('path/to/resized_image.jpg');

thumbnailImage with EXIF removal

$image = new Imagick('path/to/image.jpg'); $image->thumbnailImage($width, 0, true); // 幅を指定し、高さは自動計算 $image->writeImage('path/to/thumbnail_image.jpg');

片方のサイズを0に設定することで、縦横比を維持しながらリサイズすることができます。

thumbnailImageは、関連付けられたプロパティをすべて削除します。

「2個以上連続する半角スペース」を「半角スペースの数と同数の&nbsp;」に置換する

<?php function replaceSpaces($input) { return preg_replace_callback('/ {2,}/', function($matches) { return str_repeat('&nbsp;', strlen($matches[0])); }, $input); } $input = "これは テスト です。"; $output = replaceSpaces($input); echo $output; ?>

ランダムな文字列を作成する関数

function generateRandomString($length, $characters = 'abcdefghijklmnopqrstuvwxyz') { $randomString = ''; $charactersLength = strlen($characters); for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } // 使用例 $length = 10; // 文字数を指定 $randomString = generateRandomString($length); echo $randomString;

PHPでディレクトリを作成する

ディレクトリを作成するためには、親ディレクトリに書き込み権限が必要です。例えば、mkdir()関数を使用する場合、指定したパスの親ディレクトリに書き込み権限がないとエラーが発生します。

mkdir()関数は成功時にtrueを返し、失敗時にfalseを返します。

$parentDir = 'path/to/parent/directory'; $newDir = $parentDir . '/new_directory'; if (is_writable($parentDir)) { if (!file_exists($newDir)) { if (mkdir($newDir, 0777, true)) { echo 'ディレクトリが作成されました'; } else { echo 'ディレクトリの作成に失敗しました'; } } else { echo 'ディレクトリは既に存在します'; } } else { echo '親ディレクトリに書き込み権限がありません'; // エラーログを記録する error_log('親ディレクトリに書き込み権限がありません: ' . $parentDir); }

mkdir()関数の第三引数にtrueを指定することで、再帰的に親ディレクトリも含めて作成することができます。つまり、指定したパスの途中に存在しないディレクトリがあった場合でも、それらのディレクトリを自動的に作成してくれます。

umaskの影響でmkdirで指定したパーミッションにならないことがある:
umaskは新しく作成されるファイルやディレクトリのデフォルトのパーミッションを制限するための設定です。例えば、umaskが0022に設定されている場合、0777でディレクトリを作成しても実際には0755になります。mkdirでディレクトリを作成し、その後にchmodでパーミッションを設定して希望のパーミッションにする。

パーミッションを確認

$dir = 'path/to/directory';

if (is_readable($dir) && is_writable($dir) && is_executable($dir)) {
    echo '読み込み、書き込み、実行のすべての権限があります';
} else {
    echo '必要な権限がありません';
}