Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- // Script to fix serialized strings directly with DB access
- $host = '';
- $db = '';
- $user = '';
- $pass = '';
- $table = '';
- $column = '';
- $collation = 'utf8';
- // End tunables
- function serialize_fix_callback($match) {
- if (function_exists('mb_strlen')) {
- return 's:' . mb_strlen($match[2]);
- } else {
- return 's:' . strlen($match[2]);
- }
- }
- $con = mysqli_connect($host, $user, $pass);
- if (!$con){
- die('Could not connect: ' . mysqli_error($con));
- }
- mysqli_select_db($con, $db);
- mysqli_query($con, "SET NAMES $collation");
- $query = "SELECT `$column` FROM `$table`";
- $result = mysqli_query($con, $query);
- while ($row = mysqli_fetch_row($result)) {
- // Try single string
- $new = preg_replace_callback(
- '!^s:(\d+)(?=:"(.*?)";$)!s',
- 'serialize_fix_callback',
- $row[0]
- );
- if ($new === $row[0]) {
- // Try nested strings
- $new = preg_replace_callback(
- '!(?<=^|;)s:(\d+)(?=:"(.*?)";(?:}|a:|s:|b:|d:|i:|o:|N;))!s',
- 'serialize_fix_callback',
- $row[0]
- );
- }
- if ($new !== $row[0]) {
- if (@unserialize($row[0])) {
- // Sanity check, don't clobber if already valid
- echo "[Skipping] {$row[0]}\n";
- } elseif (@unserialize($new)) {
- // New data is valid, save
- echo "[Fixing] {$row[0]}\n";
- $query = "UPDATE `$table` SET ".
- "`$column` = '".mysqli_real_escape_string($con, $new)."' WHERE ".
- "`$column` = '".mysqli_real_escape_string($con, $row[0]).
- "'";
- if (!mysqli_query($con, $query)) {
- die(mysqli_error($con));
- }
- } else {
- // Neither old nor new data is valid
- echo "[Failed] {$row[0]}\n";
- }
- }
- }
- // vim: sw=3 ts=3 ai et
Add Comment
Please, Sign In to add comment