MySQL запрос из запроса в PHP - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь найти наиболее эффективный способ запроса результатов запроса, и каждое из решений, которые я нахожу в сети, выдает ошибку 1064. Я не понимаю, что я делаю неправильно.

Последняя итерация, которую я пробовал, следующая:

$sql = "SELECT keys.* FROM (SELECT * FROM calendar WHERE event_key LIKE '".$eventKey."%') keys WHERE event='".$eventTitle."'";

Предыдущий, который я пробовал, был:

$sql = "SELECT *(events) FROM (SELECT * AS events FROM calendar WHERE event_key LIKE '201974000') WHERE event='Event Name' AS lineitems";

Ошибка, с которой я столкнулся на последнем в phpMyAdmin:

SQL-запрос:

SELECT * (события) ОТ (ВЫБРАТЬ * КАК события из календаря) WHERE event_key LIKE '201974000') AS lineitems LIMIT 0, 25

MySQL сказал:

1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного использования синтаксиса near '(события) FROM (ВЫБЕРИТЕ * КАК события от календаря WHERE event_key LIKE '201974000' 'в строке 1

Я пытаюсь сделать запрос к моей базе данных следующим образом:

$sql = "SELECT * FROM calendar WHERE event_key LIKE '".$eventKey."%'";

... а затем запросить эти результаты примерно так:

$sql = "SELECT * FROM <<RESULTS>> WHERE event='".$eventTitle."'";

Где я ошибаюсь?

Примечание: Я тоже попробовал:

$sql = "SELECT * FROM calendar WHERE (event_key LIKE '".$eventKey."%' AND event='".$event."'";

ЗДЕСЬ ПОЛНЫЙ ФАЙЛ PHP:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>

<body>
    <?php

    function imageCorrection($string){
        $find = array("file/d/","/view?usp=drive_web");
        $replace = array("uc?id=","");
        $string = str_replace($find,$replace,$string);
        return $string;
    }

    function seoUrl($string){
        $src = 'àáâãäçèéêëìíîïñòóôõöøùúûüýÿßÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝ';
    $rep = 'aaaaaceeeeiiiinoooooouuuuyysAAAAACEEEEIIIINOOOOOOUUUUY';
        $find = array("the","and");
        $replace = array("");
        $string = strtr(utf8_decode($string),utf8_decode($src),$rep);
        $string = strtolower($string);
        $string = str_replace("");
        $string = str_replace($find,$replace,$string);
        $string = preg_replace("/[^a-z0-9\s._-]/","",$string);
        $string = preg_replace("/[\s._-]+/"," ",$string);
        $string = preg_replace("/[\s]/","-",$string);
        $string = "/events/".$string;
        if($string = "/events/"){
            $string = null;
        }
        return $string;
    }

    $year = date('Y');
    $lastYear = date('Y',strtotime("last year"));
    $nextYear = date('Y',strtotime("next year"));
    date_default_timezone_set('America/Anchorage');
    $eventTimeZone = new DateTimeZone("America/Anchorage");
    $currentTime = new DateTime("now",$eventTimeZone);
    $eventTimeOffset = $eventTimeZone->getOffset($currentTime);
    use Sabre\VObject;
    include '../../vendor/autoload.php';

    $vcalendar = VObject\Reader::read(fopen('https://calendar.google.com/calendar/ical/i8j5d94tpgnnqu6h8q3mt6uc48%40group.calendar.google.com/public/basic.ics','r'));
    $vcalendar = $vcalendar->expand(new DateTime('2018-01-01'), new DateTime('2020-12-31'));

    $servername = "localhost";
    $username    = "#########";
    $password    = "#########";
    $dbname  = "#########";

    // Create connection
    $connection = new mysqli($servername, $username, $password, $dbname);

    // Check connection
    if ($connection->connect_error){
        die("Connection to calendar failed: " . $connection->connect_error);
    }

    foreach($vcalendar->VEVENT as $event){
        $eventTitle = $event->SUMMARY;
        $eventStart = strtotime($event->DTSTART);
        $eventEnd   = strtotime($event->DTEND);
        $eventDesc  = $event->DESCRIPTION;
        $eventLocat = $event->LOCATION;
        $eventImage = imageCorrection($event->ATTACH);
        $eventKey   = date('YzB',$eventStart);
        $eventURL   = seoUrl($eventTitle);
        echo $eventKey."<br>";
        echo $eventTitle."<br>";
        echo $eventURL."<br>";
        echo $eventDesc."<br>";
        echo $eventLocat."<br>";
        echo $eventImage."<br>";
        echo date('m-d-Y h:ia',$eventStart)."<br>";
        echo date('m-d-Y h:ia',$eventEnd)."<br>";


        $sql = "SELECT * FROM calendar WHERE event_key LIKE '".$eventKey."%' AND event='".$eventTitle."'";
        $update = "UPDATE calendar SET url='".$eventURL."',image='".$eventImage."',description='".$eventDesc."',location='".$eventLocat."',start_date='".$eventStart."',end_date='".$eventEnd."',color='FFB819' WHERE (event_key LIKE '".$eventKey."%' AND event='".$eventTitle."')";
        $insert = "INSERT INTO calendar VALUES ('".$eventNum."', '".$eventTitle."', '".$eventURL."', '".$eventImage."', '".$eventDesc."', '".$eventLocat."', '".$eventStart."', '".$eventEnd."', 'FFB819')";

        $query = $connection->query($sql);
        echo "Query Results: ".$query->num_rows."  EventKey: ".$eventKey."  ".$eventTitle."<br>";
        if($query->num_rows > 0){
            echo "Rows: ==".$query->num_rows."<br>";
            $updateQUERY = $connection->query($update);
        }else{
            echo "Rows: #".$query->num_rows."<br>";
            $key = "SELECT * FROM calendar WHERE event_key LIKE '".$eventKey."%'";
            $query2 = $connection->query($key);
            if($query2->num_rows > 0){
                $eventNum = $query2->num_rows;
                $eventNum++;
                echo "Query 2 Rows: ##".$eventNum."<br>";
            }else{
                $eventNum = 0;
                echo "Query 2 Rows: #".$eventNum."<br>";
            }
            if($eventNum < 10){
                $eventNum = "00".$eventNum;
            }elseif($eventNum < 100){
                $eventNum = "0".$eventNum;
            }
            $eventNum = $eventKey.$eventNum;
            echo "Event#: ".$eventNum."<br>";
            $insertQUERY = $connection->query($insert);
        }
        echo "==============================================================================<br>";
    }


    ?>
</body>
</html>

Все эхо-строки предназначены только для тестирования, чтобы следить за выполнением кода.

1 Ответ

0 голосов
/ 09 марта 2019

Я думаю, что в данном случае избыточно выполнять подзапрос.Поскольку вы хотите просто найти где event = '$ eventTitle' только по результату вашего первого запроса, это просто говорит:

$sql = "SELECT * FROM calendar WHERE `event_key` LIKE '%$eventKey%' AND `event` = '$eventTitle'";

NB: обратите внимание, я не сделалиспользовать конкатенацию точек;потому что двойные кавычки, окружающие весь запрос, допускают переменные PHP внутри.

Ваша последняя пробная версия была близка к правильной, но вам не нужно было открывать скобки, и даже если вы хотели ее использовать, вы не сделали 'закрой его.

...