Helpex - Trao đổi & giúp đỡ Đăng nhập
3

Tôi đang cố gắng yêu cầu người dùng tải lên một tệp và sau đó đưa tệp đó vào cơ sở dữ liệu postgres từng dòng một.

Tôi có mã này và tôi gặp lỗi sau với cú pháp của mình:

Array ([0] => 42601 [1] => 7 [2] => ERROR: lỗi cú pháp tại hoặc gần "" INSERT INTO "" LINE 1: "INSERT INTO" public "." TblSedimentGrabEvent "VALUES ('A1000' ... ^)

Tôi đã xem hướng dẫn sử dụng PHP PDO và trang Postgres cũng như tìm kiếm mã lỗi nhưng vẫn không thành công. Tôi biết nó có thể là một cái gì đó nhỏ nhưng nó khiến tôi bối rối.

<?php
try { 
    $db = new PDO("pgsql:dbname=name;host=host","user","pass");
}   
catch(PDOException $e) {
    echo $e->getMessage();
}

if ($_FILES["file"]["error"] > 0)
{
    echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else
{
    echo "Uploaded Successfully!<br>";
    echo "File Name: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Temp file: " . $_FILES["file"]["tmp_name"]. "<br>";
    {
        move_uploaded_file($_FILES["file"]["tmp_name"],
        "D:/Apapub/public_html/databases/B13/temp/" . $_FILES["file"]["name"]);
        echo "Stored in: " . "D:\Apapub\public_html\databases\B13\temp" . $_FILES["file"]["name"]. "<br>";
    }

 }

$file_handle = fopen("D:/Apapub/public_html/databases/B13/temp/grabevents.txt", "r");

while (!feof($file_handle) ) {

    $text_file = fgetcsv($file_handle);

    print_r($text_file);

    $query=<<<eof
"INSERT INTO "public"."tblSedimentGrabEvent" VALUES ('$text_file[0]','$text_file[1]','$text_file[2]','$text_file[3]','$text_file[4]','$text_file[5]','$text_file[6]','$text_file[7]','$text_file[8]','$text_file[9]','$text_file[10]','$text_file[11]','$text_file[12]','$text_file[13]','$text_file[14]','$text_file[15]','$text_file[16]','$text_file[17]','$text_file[18]','$text_file[19]','$text_file[20]','$text_file[21]','$text_file[22]','$text_file[23]')"
    eof;
    $sth = $db->query($query);
}
if (!$sth) {
    echo "<p>\nPDO::errorInfo():\n</p>";
    print_r($db->errorInfo());
} 
fclose($file_handle);

echo "<p><b>Records Imported</b></p>";

?>

Đây là mảng mẫu:

A1000,24,M,28/Mar/2013,11:45:27,1,SCCWRP,Singel Van Veen,33.1234,-118.523,AGPS,12,cm,Olive Green,Sand,None,Yes,No,No,No,None,Test Record # 1,No,22/May/2013
A1000,24,M,28/Mar/2013,11:45:27,1,SCCWRP,Singel Van Veen,33.1334,-118.543,AGPS,12,cm,Olive Green,Sand,None,Yes,No,No,No,None,Test Record # 1,No,15/May/2013
A1000,24,M,28/Mar/2013,11:56:33,2,SCCWRP,Single Van Veen,33.1635,-118.593,AGPS,12,cm,Olive Green,Sand,None,No,Yes,No,No,None,Test Record #2,No,15/May/2013
A1000,24,M,28/Mar/2013,12:06:33,3,SCCWRP,Single Van Veen,33.1534,-118.563,AGPS,12,cm,Olive Green,Sand,None,No,No,Yes,No,None,Test Record #3,No,15/May/2013
A1000,24,M,28/Mar/2013,12:12:33,4,SCCWRP,Single Van Veen,33.1034,-118.503,AGPS,12,cm,Olive Green,Sand,None,No,No,No,yes,None,Test Record #4,No,15/May/2013

Tôi đã thành công khi sử dụng lệnh COPY nhưng người giám sát của tôi muốn nó phân tích cú pháp theo từng dòng để chạy một số kiểm tra sau này

!!TRẢ LỜI!!

Tôi không biết cách đưa đạo cụ cho @Spudley nhưng anh ấy đã giúp tôi trả lời câu hỏi.

Sau khi làm những gì anh ấy nói, tôi thấy rằng tôi không cần trích dẫn xung quanh truy vấn (tôi đoán nó là do tôi đang sử dụng heredoc?).

Điều này đã hoạt động (nhưng: chỉnh sửa bởi Craig Ringer, điều này vẫn không an toàn một cách nguy hiểm và không bao giờ được sử dụng, không sao chép mã này làm mã ví dụ):

$query=<<<eof
INSERT INTO "public"."tblSedimentGrabEvent" VALUES ('$text_file[0]','$text_file[1]','$text_file[2]','$text_file[3]','$text_file[4]','$text_file[5]','$text_file[6]','$text_file[7]','$text_file[8]','$text_file[9]','$text_file[10]','$text_file[11]','$text_file[12]','$text_file[13]','$text_file[14]','$text_file[15]','$text_file[16]','$text_file[17]','$text_file[18]','$text_file[19]','$text_file[20]','$text_file[21]','$text_file[22]','$text_file[23]')
eof;
$sth = $db->query($query);

Cảm ơn một lần nữa!

3 hữu ích 3 bình luận 2.9k xem chia sẻ
1

Việc thay thế văn bản thành SQL dễ xảy ra lỗi, không an toàn, khó gỡ lỗi và phong cách tồi tệ. Sử dụng các câu lệnh được tham số hóa, với PDO hoặc với pg_query_params. "Câu trả lời" của bạn là hoàn toàn không an toàn, vui lòng không sử dụng nó.

Điều đó sẽ không chỉ khắc phục sự cố của bạn mà còn bảo vệ bạn chống lại toàn bộ các lỗ hổng bảo mật nghiêm trọng bao gồm cả SQL injection. Xem wikipedia , bảng bobbyhướng dẫn sử dụng PHP .

Xem câu trả lời trước này quá.

Trong khi bạn đang ở đó, hãy cân nhắc sử dụng COPY, cách này hiệu quả hơn rất nhiều, chỉ cần truyền trực tiếp CSV vào một bảng trong PostgreSQL. Xem pg_copy_fromhoặc pg_put_linechức năng cấp thấp hơn .

1 hữu ích 0 bình luận chia sẻ
0

Tôi đã nhận được câu trả lời từ trang này: PHP PDO: Tôi có thể liên kết một mảng với điều kiện IN () không?

Mã của tôi đã kết thúc như vậy:

$file_handle = fopen("D:/Apapub/public_html/databases/B13/temp/grabevents.txt", "r");

while (!feof($file_handle) ) {

$text_file = fgetcsv($file_handle);

foreach($text_file as &$val)
$val=$db->quote($val);

$data = implode(',',$text_file);

$q = $db->prepare('Insert Into "public"."tblSedimentGrabEvent" Values ('.$data.')');

$q->execute();
}

Và bây giờ nó hoạt động hoàn hảo trong khi hy vọng ngăn chặn SQL Injjection.

0 hữu ích 5 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ php postgresql csv pdo insert-into , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading