2011-08-29 27 views
8

Tôi có một câu lệnh INSERT trong một tệp PHP trong đó có ký hiệu (@) đang diễn ra ở phía trước tên cột.Tại-Đăng nhập vào câu lệnh SQL trước tên cột

@ field1, field2 @,

Đó là một cơ sở dữ liệu MySQL. Chữ ký tại nghĩa là gì?

Chỉnh sửa:
Không có SET @field1 := 'test' trong tập lệnh PHP. Kịch bản PHP đọc một csv và đặt dữ liệu vào bảng. Nó có thể bị lạm dụng như một tính năng bình luận không?

<?php 
$typo_db_username = 'xyz'; // Modified or inserted by TYPO3 Install Tool. 
$typo_db_password = 'xyz'; // Modified or inserted by TYPO3 Install Tool. 

// login 
$_SESSION['host'] = "localhost"; 
$_SESSION['port'] = "3306"; 
$_SESSION['user'] = $typo_db_username; 
$_SESSION['password'] = $typo_db_password; 
$_SESSION['dbname'] = "database"; 


$cxn = mysqli_connect($_SESSION['host'], $_SESSION['user'], $_SESSION['password'], $_SESSION['dbname'], $_SESSION['port']) or die ("SQL Error:" . mysqli_connect_error()); 
mysqli_query($cxn, "SET NAMES utf8"); 

$sqltrunc = "TRUNCATE TABLE tablename"; 
$resulttrunc = mysqli_query($cxn,$sqltrunc) or die ("Couldn’t execute query: ".mysqli_error($cxn)); 

$sql1 = " 
LOAD DATA LOCAL 
INFILE 'import.csv' 
REPLACE 
INTO TABLE tablename 
FIELDS 
TERMINATED BY ';' 
OPTIONALLY ENCLOSED BY '\"' 
IGNORE 1 LINES 
(
`normalField`, 
@field1, 
@field2, 
`normalField2`, 
@field3, 
@field4 
)"; 

$result1 = mysqli_query($cxn,$sql1) or die ("Couldn’t execute query: " . mysqli_error($cxn)); 


?>' 

SOLUTION:

Cuối cùng, tôi tìm thấy nó ra! Trường @ được sử dụng làm giả để bỏ lỡ một cột trong tệp csv. Xem http://www.php-resource.de/forum/showthread/t-97082.html http://dev.mysql.com/doc/refman/5.0/en/load-data.html

+0

@testing - Tôi thấy bạn đã thêm "Bản sao có thể có" vào câu hỏi của riêng bạn để được bỏ phiếu trong một cuộc bỏ phiếu kín trên cơ sở đó. Bạn có thể làm rõ điều đó trả lời câu hỏi của bạn không? –

+0

Nó không phải là một dupe, các liên kết yêu cầu sự khác biệt giữa một var bình thường và một '@ var', câu hỏi này yêu cầu những gì' @ xyz' trong một truy vấn có nghĩa là. – Johan

+0

Nó sẽ dễ dàng hơn để có được cụ thể nếu bạn bao gồm ** có liên quan ** php-code với các truy vấn trong đó. – Johan

Trả lời

8

Dấu hiệu @ là một biến trong SQL.

Trong MySQL, nó được sử dụng để lưu trữ giá trị giữa các lần chạy liên tiếp của truy vấn hoặc để chuyển dữ liệu giữa hai truy vấn khác nhau.

Một ví dụ

Truyền dữ liệu giữa hai truy vấn

SELECT @biggest:= MAX(field1) FROM atable; 
SELECT * FROM bigger_table WHERE field1 > @biggest; 

sử dụng khác là trong bảng xếp hạng, mà MySQL không có hỗ trợ cho.

cửa hàng một giá trị cho chạy liên tiếp của một truy vấn

INSERT INTO table2 
    SELECT @rank := @rank + 1, table1.* FROM table1 
    JOIN(SELECT @rank := 0) AS init 
    ORDER BY number_of_users DESC 

Lưu ý rằng để cho tiện làm việc, thứ tự trong đó các hàng được xử lý trong truy vấn phải được cố định, thật dễ dàng để có được điều này sai.

Xem:
http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
mysql sorting and ranking statement
http://www.xaprb.com/blog/2006/12/15/advanced-mysql-user-variable-techniques/

CẬP NHẬT
Mã này sẽ không bao giờ làm việc.
Bạn vừa mở kết nối trước và không có nơi nào được đặt @fields.
Hiện tại, họ giữ các giá trị null.
Đầu trang, bạn không thể sử dụng @vars để biểu thị tên trường, bạn có thể chỉ sử dụng @vars cho giá trị.

$sql1 = " 
LOAD DATA LOCAL INFILE 'import.csv' 
REPLACE INTO TABLE tablename 
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' 
IGNORE 1 LINES 
(`normalField`, @field1, @field2, `normalField2`, @field3, @field4)"; 
+0

Giá trị có thể được lưu trữ trong một tập lệnh php khác không? Nó có thể được sử dụng trên biên giới của một tập tin php? Bởi vì các giá trị không bao giờ được đặt trong tập lệnh mà tôi có ... – testing

+0

Không, '@ vars' là kết nối cụ thể. Bạn không thể chuyển chúng giữa các kết nối. – Johan

+0

Tập lệnh không phải của tôi. Tôi phải sửa nó ... Bạn có nghĩa là giá trị null được nhập khẩu. Hậu quả của việc này là gì? Giải pháp tốt nhất là thay thế hoặc xóa các trường đó? – testing

Các vấn đề liên quan